From patchwork Fri Feb 15 16:00:04 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Liu X-Patchwork-Id: 220764 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 58DDF2C0082 for ; Sat, 16 Feb 2013 03:00:59 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935920Ab3BOQAz (ORCPT ); Fri, 15 Feb 2013 11:00:55 -0500 Received: from smtp02.citrix.com ([66.165.176.63]:29656 "EHLO SMTP02.CITRIX.COM" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756331Ab3BOQAx (ORCPT ); Fri, 15 Feb 2013 11:00:53 -0500 X-IronPort-AV: E=Sophos;i="4.84,674,1355097600"; d="scan'208";a="7324903" Received: from accessns.citrite.net (HELO FTLPEX01CL03.citrite.net) ([10.9.154.239]) by FTLPIPO02.CITRIX.COM with ESMTP/TLS/AES128-SHA; 15 Feb 2013 16:00:53 +0000 Received: from ukmail1.uk.xensource.com (10.80.16.128) by smtprelay.citrix.com (10.13.107.80) with Microsoft SMTP Server id 14.2.318.1; Fri, 15 Feb 2013 11:00:52 -0500 Received: from dt47.uk.xensource.com ([10.80.229.47]) by ukmail1.uk.xensource.com with esmtp (Exim 4.69) (envelope-from ) id 1U6NiW-0005WO-GM; Fri, 15 Feb 2013 16:00:52 +0000 From: Wei Liu To: , , , , CC: Wei Liu Subject: [PATCH 3/8] netback: get/put module along with vif connect/disconnect Date: Fri, 15 Feb 2013 16:00:04 +0000 Message-ID: <1360944010-15336-4-git-send-email-wei.liu2@citrix.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1360944010-15336-1-git-send-email-wei.liu2@citrix.com> References: <1360944010-15336-1-git-send-email-wei.liu2@citrix.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If there is vif running and user unloads netback, guest's network interface just mysteriously stops working. So we need to prevent unloading netback module if there is vif running. The disconnect function of vif may get called by the generic framework even before vif connects, so thers is an extra check on whether we actually need to put module when disconnecting a vif. Signed-off-by: Wei Liu --- drivers/net/xen-netback/interface.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 221f426..db638e1 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -314,6 +314,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; @@ -341,6 +343,7 @@ int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref, err_unmap: xen_netbk_unmap_frontend_rings(vif); err: + module_put(THIS_MODULE); return err; } @@ -358,18 +361,31 @@ void xenvif_carrier_off(struct xenvif *vif) void xenvif_disconnect(struct xenvif *vif) { + /* + * This function may get called even before vif connets, set + * need_module_put if vif->irq != 0, which means vif has + * already connected, we should call module_put to balance the + * previous __module_get. + */ + int need_module_put = 0; + if (netif_carrier_ok(vif->dev)) xenvif_carrier_off(vif); atomic_dec(&vif->refcnt); wait_event(vif->waiting_to_free, atomic_read(&vif->refcnt) == 0); - if (vif->irq) + if (vif->irq) { unbind_from_irqhandler(vif->irq, vif); + need_module_put = 1; + } unregister_netdev(vif->dev); xen_netbk_unmap_frontend_rings(vif); free_netdev(vif->dev); + + if (need_module_put) + module_put(THIS_MODULE); }