[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1328005476.26983.335.camel@zakaz.uk.xensource.com>
Date: Tue, 31 Jan 2012 10:24:36 +0000
From: Ian Campbell <Ian.Campbell@...rix.com>
To: Wei Liu <wei.liu2@...rix.com>
CC: "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
"xen-devel@...ts.xensource.com" <xen-devel@...ts.xensource.com>,
"konrad.wilk@...cle.com" <konrad.wilk@...cle.com>
Subject: Re: [RFC PATCH V3 05/16] netback: add module get/put operations
along with vif connect/disconnect.
On Mon, 2012-01-30 at 14:45 +0000, Wei Liu wrote:
> If there is vif running and user unloads netback, it will certainly
> cause problems -- guest's network interface just mysteriously stops
> working.
This seems like a bug fix for 02/16 "netback: add module unload
function". Please could you fold back such fixes where appropriate? I
think there's a handful of these sorts of patches in the series.
> v2: fix module_put path
>
> disconnect function may get called by the generic framework even
> before vif connects.
>
> Tested-by: Konrad Rzeszutek Wilk <konrad.wilk@...cle.com>
> Signed-off-by: Wei Liu <wei.liu2@...rix.com>
> ---
> drivers/net/xen-netback/interface.c | 11 ++++++++++-
> 1 files changed, 10 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
> index dfc04f8..7914f60 100644
> --- a/drivers/net/xen-netback/interface.c
> +++ b/drivers/net/xen-netback/interface.c
> @@ -323,6 +323,8 @@ int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref,
> if (vif->irq)
> return 0;
>
> + __module_get(THIS_MODULE);
> +
> err = xen_netbk_map_frontend_rings(vif, tx_ring_ref, rx_ring_ref);
> if (err < 0)
> goto err;
> @@ -372,12 +374,14 @@ err_unbind:
> err_unmap:
> xen_netbk_unmap_frontend_rings(vif);
> err:
> + module_put(THIS_MODULE);
> return err;
> }
>
> void xenvif_disconnect(struct xenvif *vif)
> {
> struct net_device *dev = vif->dev;
> + int need_module_put = 0;
>
> if (netif_carrier_ok(dev)) {
> rtnl_lock();
> @@ -397,12 +401,17 @@ void xenvif_disconnect(struct xenvif *vif)
>
> del_timer_sync(&vif->credit_timeout);
>
> - if (vif->irq)
> + if (vif->irq) {
> unbind_from_irqhandler(vif->irq, vif);
> + need_module_put = 1;
This seems like a slightly odd condition. Why is the put not
unconditional?
> + }
>
> unregister_netdev(vif->dev);
>
> xen_netbk_unmap_frontend_rings(vif);
>
> free_netdev(vif->dev);
> +
> + if (need_module_put)
> + module_put(THIS_MODULE);
> }
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists