diff options
Diffstat (limited to 'drivers/net/xen-netback/xenbus.c')
| -rw-r--r-- | drivers/net/xen-netback/xenbus.c | 20 | 
1 files changed, 10 insertions, 10 deletions
| diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index d2d7cd9145b1..a56d3eab35dd 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c @@ -495,26 +495,26 @@ static void backend_disconnect(struct backend_info *be)  	struct xenvif *vif = be->vif;  	if (vif) { +		unsigned int num_queues = vif->num_queues;  		unsigned int queue_index; -		struct xenvif_queue *queues;  		xen_unregister_watchers(vif);  #ifdef CONFIG_DEBUG_FS  		xenvif_debugfs_delif(vif);  #endif /* CONFIG_DEBUG_FS */  		xenvif_disconnect_data(vif); -		for (queue_index = 0; -		     queue_index < vif->num_queues; -		     ++queue_index) -			xenvif_deinit_queue(&vif->queues[queue_index]); -		spin_lock(&vif->lock); -		queues = vif->queues; +		/* At this point some of the handlers may still be active +		 * so we need to have additional synchronization here. +		 */  		vif->num_queues = 0; -		vif->queues = NULL; -		spin_unlock(&vif->lock); +		synchronize_net(); -		vfree(queues); +		for (queue_index = 0; queue_index < num_queues; ++queue_index) +			xenvif_deinit_queue(&vif->queues[queue_index]); + +		vfree(vif->queues); +		vif->queues = NULL;  		xenvif_disconnect_ctrl(vif);  	} |