diff options
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
| -rw-r--r-- | drivers/net/xen-netback/interface.c | 28 | 
1 files changed, 11 insertions, 17 deletions
| diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 625c6f49cfba..01bb854c7f62 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -353,6 +353,9 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,  	}  	netdev_dbg(dev, "Successfully created xenvif\n"); + +	__module_get(THIS_MODULE); +  	return vif;  } @@ -366,8 +369,6 @@ int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref,  	if (vif->tx_irq)  		return 0; -	__module_get(THIS_MODULE); -  	err = xenvif_map_frontend_rings(vif, tx_ring_ref, rx_ring_ref);  	if (err < 0)  		goto err; @@ -406,7 +407,7 @@ int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref,  	init_waitqueue_head(&vif->wq);  	vif->task = kthread_create(xenvif_kthread, -				   (void *)vif, vif->dev->name); +				   (void *)vif, "%s", vif->dev->name);  	if (IS_ERR(vif->task)) {  		pr_warn("Could not allocate kthread for %s\n", vif->dev->name);  		err = PTR_ERR(vif->task); @@ -452,12 +453,6 @@ void xenvif_carrier_off(struct xenvif *vif)  void xenvif_disconnect(struct xenvif *vif)  { -	/* Disconnect funtion might get called by generic framework -	 * even before vif connects, so we need to check if we really -	 * need to do a module_put. -	 */ -	int need_module_put = 0; -  	if (netif_carrier_ok(vif->dev))  		xenvif_carrier_off(vif); @@ -468,23 +463,22 @@ void xenvif_disconnect(struct xenvif *vif)  			unbind_from_irqhandler(vif->tx_irq, vif);  			unbind_from_irqhandler(vif->rx_irq, vif);  		} -		/* vif->irq is valid, we had a module_get in -		 * xenvif_connect. -		 */ -		need_module_put = 1; +		vif->tx_irq = 0;  	}  	if (vif->task)  		kthread_stop(vif->task); +	xenvif_unmap_frontend_rings(vif); +} + +void xenvif_free(struct xenvif *vif) +{  	netif_napi_del(&vif->napi);  	unregister_netdev(vif->dev); -	xenvif_unmap_frontend_rings(vif); -  	free_netdev(vif->dev); -	if (need_module_put) -		module_put(THIS_MODULE); +	module_put(THIS_MODULE);  } | 
