|
@@ -493,11 +493,20 @@ static int backend_create_xenvif(struct backend_info *be)
|
|
|
static void backend_disconnect(struct backend_info *be)
|
|
|
{
|
|
|
if (be->vif) {
|
|
|
+ unsigned int queue_index;
|
|
|
+
|
|
|
xen_unregister_watchers(be->vif);
|
|
|
#ifdef CONFIG_DEBUG_FS
|
|
|
xenvif_debugfs_delif(be->vif);
|
|
|
#endif /* CONFIG_DEBUG_FS */
|
|
|
xenvif_disconnect_data(be->vif);
|
|
|
+ for (queue_index = 0; queue_index < be->vif->num_queues; ++queue_index)
|
|
|
+ xenvif_deinit_queue(&be->vif->queues[queue_index]);
|
|
|
+
|
|
|
+ vfree(be->vif->queues);
|
|
|
+ be->vif->num_queues = 0;
|
|
|
+ be->vif->queues = NULL;
|
|
|
+
|
|
|
xenvif_disconnect_ctrl(be->vif);
|
|
|
}
|
|
|
}
|
|
@@ -1034,6 +1043,8 @@ static void connect(struct backend_info *be)
|
|
|
err:
|
|
|
if (be->vif->num_queues > 0)
|
|
|
xenvif_disconnect_data(be->vif); /* Clean up existing queues */
|
|
|
+ for (queue_index = 0; queue_index < be->vif->num_queues; ++queue_index)
|
|
|
+ xenvif_deinit_queue(&be->vif->queues[queue_index]);
|
|
|
vfree(be->vif->queues);
|
|
|
be->vif->queues = NULL;
|
|
|
be->vif->num_queues = 0;
|