From patchwork Thu Apr 9 11:54:45 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bart Van Assche X-Patchwork-Id: 459723 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 356531402DC for ; Thu, 9 Apr 2015 22:27:04 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755245AbbDIM0x (ORCPT ); Thu, 9 Apr 2015 08:26:53 -0400 Received: from mail-bl2on0085.outbound.protection.outlook.com ([65.55.169.85]:5629 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753694AbbDIM0u (ORCPT ); Thu, 9 Apr 2015 08:26:50 -0400 X-Greylist: delayed 1919 seconds by postgrey-1.27 at vger.kernel.org; Thu, 09 Apr 2015 08:26:50 EDT Received: from BLUPR02CA046.namprd02.prod.outlook.com (25.160.23.164) by BLUPR02MB1268.namprd02.prod.outlook.com (25.163.80.18) with Microsoft SMTP Server (TLS) id 15.1.130.23; Thu, 9 Apr 2015 11:54:50 +0000 Received: from BL2FFO11FD012.protection.gbl (2a01:111:f400:7c09::107) by BLUPR02CA046.outlook.office365.com (2a01:111:e400:8ad::36) with Microsoft SMTP Server (TLS) id 15.1.130.23 via Frontend Transport; Thu, 9 Apr 2015 11:54:50 +0000 Authentication-Results: spf=pass (sender IP is 63.163.107.173) smtp.mailfrom=sandisk.com; vger.kernel.org; dkim=none (message not signed) header.d=none; Received-SPF: Pass (protection.outlook.com: domain of sandisk.com designates 63.163.107.173 as permitted sender) receiver=protection.outlook.com; client-ip=63.163.107.173; helo=milsmgep12.sandisk.com; Received: from milsmgep12.sandisk.com (63.163.107.173) by BL2FFO11FD012.mail.protection.outlook.com (10.173.161.18) with Microsoft SMTP Server id 15.1.142.12 via Frontend Transport; Thu, 9 Apr 2015 11:54:48 +0000 Received: from MILHUBIP03.sdcorp.global.sandisk.com ( [172.22.12.162]) by milsmgep12.sandisk.com (Symantec Messaging Gateway) with SMTP id 11.F0.14695.88866255; Thu, 9 Apr 2015 04:54:48 -0700 (PDT) Received: from milsmgip12.sandisk.com (10.177.8.100) by MILHUBIP03.sdcorp.global.sandisk.com (10.177.9.96) with Microsoft SMTP Server id 14.3.224.2; Thu, 9 Apr 2015 04:54:48 -0700 X-AuditID: ac160a69-f79656d000003967-6b-55266888f8a0 Received: from [10.50.231.50] ( [10.177.8.100]) by milsmgip12.sandisk.com (Symantec Messaging Gateway) with SMTP id 24.F2.04406.68866255; Thu, 9 Apr 2015 04:54:47 -0700 (PDT) Message-ID: <55266885.6010905@sandisk.com> Date: Thu, 9 Apr 2015 13:54:45 +0200 From: Bart Van Assche User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: "David S. Miller" CC: Thomas Gleixner , Peter Zijlstra , Subject: [PATCH] e1000: Avoid that e1000_netpoll() triggers a kernel warning X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrPLMWRmVeSWpSXmKPExsWyRoxnkW5Hhlqowa01PBZzzrewWBxbIGZx vPcAk8XmTVOZHVg8tqy8yeSxeYWWx7tz59g9Pm+SC2CJ4rJJSc3JLEst0rdL4Mo43L6RrWC9 csW59xdZGhiPynUxcnJICJhIfGpoYISwxSQu3FvP1sXIxSEkcIJRovv+PhYIZzujRP+Tj2ww HS+e9rJDJDYzSqx80wXWziugJXHz52EmEJtFQEWi9f1eZhCbTcBI4tv7mSwgtqhAmMS0389Z IeoFJU7OfAIWFxHQllh3oAcsziyQLXH+1QewmcICPhKrW34BLeYAimtKrN+lD1EiL7H97Rxm kBskBCaxSuzsvA02R0hAXeLkkvlMExiFZiFZMQuhfRaS9gWMzKsYxXIzc4pz01MLDI30ihPz UjKLs/WS83M3MYKDnStzB+OKSeaHGAU4GJV4eF98Uw0VYk0sK67MPcQowcGsJMLrkaoWKsSb klhZlVqUH19UmpNafIhRmoNFSZxXcHqWv5BAemJJanZqakFqEUyWiYNTqoFRaFn280XC4YXL s9seWwZNsIkyEfphN7dYWWpDRCqHsDzP/jDhczMF2MSyrSbuyIpk3zX/jsWfTdFTi6z3Su9Z uXbdUwuNPonLs/vmzD0yYf6rL7tDTgik1UZt8rfhr7F+eK/mm7W21qR3d2TL5/u8PbLnVd+r h1IzJ1Wa7f+1Y8Kq8o8vvq5/qcRSnJFoqMVcVJwIADdOqatyAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKJMWRmVeSWpSXmKPExsXCtZEjRbc9Qy3U4Odka4s551tYLI4tELM4 3nuAyWLzpqnMDiweW1beZPLYvELL4925c+wenzfJBbBEcdmkpOZklqUW6dslcGUcbt/IVrBe ueLc+4ssDYxH5boYOTkkBEwkXjztZYewxSQu3FvPBmILCWxklFj0iBfE5hXQkrj58zATiM0i oCrxr+UkWA2bgJHEt/czWUBsUYEwiWm/n7NC1AtKnJz5BCwuIqAtse5AD1icWSBH4veVq2Bz hAV8JFa3/GKDiKtL/Jl3iRnClpfY/nYO8wRG3llIRs1CUjYLSdkCRuZVjGK5mTnFuemZBYZG esWJeSmZxdl6yfm5mxjBAccZtYPx+kTzQ4xMHJxSDYxGhR4NMepnuBgYP0zuf88pkrXzwPzL P80vP2p9tNkj8lhohva2uywS5pcEWZdv2mzZYX5rP/PfCP/k3LjnuyP9Zu7zuZOo/UpvY/Sb SpudX45e8CiLPvNZMvn8kpfehuuW9H0tVPp9kMHDirH/Cf8Kuy+qW9Y/aZUQkLix8VpDlOLq 6zvNHVYqsRRnJBpqMRcVJwIA1mw46+gBAAA= X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:63.163.107.173; CTRY:US; IPV:NLI; EFV:NLI; BMV:1; SFV:NSPM; SFS:(10009020)(6009001)(438002)(199003)(189002)(77096005)(77156002)(229853001)(110136001)(36756003)(15975445007)(54356999)(106466001)(62966003)(65956001)(65806001)(59896002)(64126003)(47776003)(92566002)(46102003)(117636001)(19580405001)(83506001)(50466002)(87936001)(86362001)(19580395003)(99136001)(50986999)(23676002)(62816006); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR02MB1268; H:milsmgep12.sandisk.com; FPR:; SPF:Pass; MLV:sfv; A:1; MX:1; LANG:en; X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR02MB1268; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5002010)(5005006); SRVR:BLUPR02MB1268; BCL:0; PCL:0; RULEID:; SRVR:BLUPR02MB1268; X-Forefront-PRVS: 0541031FF6 X-OriginatorOrg: sandisk.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Apr 2015 11:54:48.5231 (UTC) X-MS-Exchange-CrossTenant-Id: fcd9ea9c-ae8c-460c-ab3c-3db42d7ac64d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fcd9ea9c-ae8c-460c-ab3c-3db42d7ac64d; Ip=[63.163.107.173]; Helo=[milsmgep12.sandisk.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR02MB1268 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org console_cont_flush(), which is called by console_unlock(), calls call_console_drivers() and hence also the netconsole function write_msg() with local interrupts disabled. This means that it is not allowed to call disable_irq() from inside a netpoll callback function. Hence eliminate the disable_irq() / enable_irq() pair from the e1000 netpoll function. This patch avoids that the e1000 networking driver triggers the following complaint: BUG: sleeping function called from invalid context at kernel/irq/manage.c:104 Call Trace: [] dump_stack+0x4c/0x65 [] ___might_sleep+0x175/0x230 [] __might_sleep+0x3a/0xa0 [] synchronize_irq+0x38/0xa0 [] disable_irq+0x20/0x30 [] e1000_netpoll+0x102/0x130 [e1000e] [] netpoll_poll_dev+0x72/0x350 [] netpoll_send_skb_on_dev+0x1b9/0x2b0 [] netpoll_send_udp+0x2c2/0x430 [] write_msg+0xcf/0x120 [netconsole] [] call_console_drivers.constprop.25+0xc2/0x250 [] console_unlock+0x328/0x4c0 [] vprintk_emit+0x2d0/0x570 [] vprintk_default+0x1f/0x30 [] printk+0x46/0x48 See also "[RFC PATCH net-next 00/11] net: remove disable_irq() from ->ndo_poll_controller" (http://thread.gmane.org/gmane.linux.network/342096). See also patch "sched/wait: Add might_sleep() checks" (kernel v3.19-rc1; commit e22b886a8a43). Reported-by: Sabrina Dubroca Signed-off-by: Bart Van Assche Cc: Thomas Gleixner Cc: David S. Miller Cc: Peter Zijlstra Cc: --- drivers/net/ethernet/intel/e1000/e1000.h | 5 +++++ drivers/net/ethernet/intel/e1000/e1000_main.c | 27 ++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/intel/e1000/e1000.h b/drivers/net/ethernet/intel/e1000/e1000.h index 6970710..d85d19f 100644 --- a/drivers/net/ethernet/intel/e1000/e1000.h +++ b/drivers/net/ethernet/intel/e1000/e1000.h @@ -323,6 +323,11 @@ struct e1000_adapter { struct delayed_work watchdog_task; struct delayed_work fifo_stall_task; struct delayed_work phy_info_task; + +#ifdef CONFIG_NET_POLL_CONTROLLER + /* Used to serialize e1000 interrupts and the e1000 netpoll callback. */ + spinlock_t netpoll_lock; +#endif }; enum e1000_state_t { diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 7f997d3..36870f8 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c @@ -1313,6 +1313,9 @@ static int e1000_sw_init(struct e1000_adapter *adapter) e1000_irq_disable(adapter); spin_lock_init(&adapter->stats_lock); +#ifdef CONFIG_NET_POLL_CONTROLLER + spin_lock_init(&adapter->netpoll_lock); +#endif set_bit(__E1000_DOWN, &adapter->flags); @@ -3751,10 +3754,8 @@ void e1000_update_stats(struct e1000_adapter *adapter) * @irq: interrupt number * @data: pointer to a network interface device structure **/ -static irqreturn_t e1000_intr(int irq, void *data) +static irqreturn_t __e1000_intr(int irq, struct e1000_adapter *adapter) { - struct net_device *netdev = data; - struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_hw *hw = &adapter->hw; u32 icr = er32(ICR); @@ -3796,6 +3797,24 @@ static irqreturn_t e1000_intr(int irq, void *data) return IRQ_HANDLED; } +static irqreturn_t e1000_intr(int irq, void *data) +{ + struct net_device *netdev = data; + struct e1000_adapter *adapter = netdev_priv(netdev); + irqreturn_t ret; +#ifdef CONFIG_NET_POLL_CONTROLLER + unsigned long flags; + + spin_lock_irqsave(&adapter->netpoll_lock, flags); + ret = __e1000_intr(irq, adapter); + spin_unlock_irqrestore(&adapter->netpoll_lock, flags); +#else + ret = __e1000_intr(irq, adapter); +#endif + + return ret; +} + /** * e1000_clean - NAPI Rx polling callback * @adapter: board private structure @@ -5220,9 +5239,7 @@ static void e1000_netpoll(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); - disable_irq(adapter->pdev->irq); e1000_intr(adapter->pdev->irq, netdev); - enable_irq(adapter->pdev->irq); } #endif