From patchwork Thu Dec 24 13:11:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ahmed S. Darwish" X-Patchwork-Id: 352224 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 07BECC433E9 for ; Thu, 24 Dec 2020 13:12:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BB2EE22512 for ; Thu, 24 Dec 2020 13:12:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728355AbgLXNMj (ORCPT ); Thu, 24 Dec 2020 08:12:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45624 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726544AbgLXNMi (ORCPT ); Thu, 24 Dec 2020 08:12:38 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7667EC061794; Thu, 24 Dec 2020 05:11:58 -0800 (PST) From: "Ahmed S. Darwish" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1608815515; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=k23O2xyiw8gGd/X+qORUBIx3eM546L8uEpAKnZ3UL7s=; b=1RBjqIJ7osehDAyPJ88oI9YIN34wB49UR8tfVzfmmvuvk2i9uAmmEN1pZBzIZqewpPhjLL 7RUzsErTdvajQ0PLbvQ1/vc37/LNK1MgDCzJTZ8fwxC7WjKceq4kFkou5k7ZLx8rksbW4T S2OQ4agyL03NNk5Hyl3DlCZrfOgEbNwTehpRQlae0T3r9jx7O8aGQaEvUsIfZH9PHp4oDE s9+6tXzGEVSukvpXLixCZIvxlI5Gl5fgD5cnhbKWG0YKAAzJRXOfmMAykqGmYxejp0CO1i y7YP5RUZDnbgkWPt5nF+QGN+3txqvBk8ogadZfig9sk5hOWABDRSRQJ97wYgeQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1608815515; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=k23O2xyiw8gGd/X+qORUBIx3eM546L8uEpAKnZ3UL7s=; b=xz9jTuyvkmSVelH5/sfjwfLTssNgh5ejOynV/LI+iG15kPxnDtVC7yw1YwceJKhZZBOwKl aYnw48qeaEiFcyDw== To: Rahul Lakkireddy , Rohit Maheshwari , Vinay Kumar Yadav , Vishal Kulkarni , netdev@vger.kernel.org Cc: "David S. Miller" , Jakub Kicinski , LKML , Thomas Gleixner , "Sebastian A. Siewior" , "Ahmed S. Darwish" Subject: [RFC PATCH 1/3] chelsio: cxgb: Remove ndo_poll_controller() Date: Thu, 24 Dec 2020 14:11:46 +0100 Message-Id: <20201224131148.300691-2-a.darwish@linutronix.de> In-Reply-To: <20201224131148.300691-1-a.darwish@linutronix.de> References: <20201224131148.300691-1-a.darwish@linutronix.de> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Since commit ac3d9dd034e5 ("netpoll: make ndo_poll_controller() optional"), networking drivers which use NAPI for clearing their TX completions should not provide an ndo_poll_controller(). Netpoll simply triggers the necessary TX queues cleanup by synchronously calling the driver's NAPI poll handler -- with irqs off and a zero budget. Modify the cxgb's poll method to clear the TX queues upon zero budget. Per API requirements, make sure to never consume any RX packet in that case (budget=0), and thus also not to increment the budget upon return. Afterwards, remove ndo_poll_controller(). Link: https://lkml.kernel.org/r/20180921222752.101307-1-edumazet@google.com Link: https://lkml.kernel.org/r/A782704A-DF97-4E85-B10A-D2268A67DFD7@fb.com References: 822d54b9c2c1 ("netpoll: Drop budget parameter from NAPI polling call hierarchy") Signed-off-by: Ahmed S. Darwish Cc: Eric Dumazet --- drivers/net/ethernet/chelsio/cxgb/cxgb2.c | 14 -------------- drivers/net/ethernet/chelsio/cxgb/sge.c | 9 ++++++++- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c index 0e4a0f413960..7b5a98330ef7 100644 --- a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c +++ b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c @@ -878,17 +878,6 @@ static int t1_set_features(struct net_device *dev, netdev_features_t features) return 0; } -#ifdef CONFIG_NET_POLL_CONTROLLER -static void t1_netpoll(struct net_device *dev) -{ - unsigned long flags; - struct adapter *adapter = dev->ml_priv; - - local_irq_save(flags); - t1_interrupt(adapter->pdev->irq, adapter); - local_irq_restore(flags); -} -#endif /* * Periodic accumulation of MAC statistics. This is used only if the MAC @@ -973,9 +962,6 @@ static const struct net_device_ops cxgb_netdev_ops = { .ndo_set_mac_address = t1_set_mac_addr, .ndo_fix_features = t1_fix_features, .ndo_set_features = t1_set_features, -#ifdef CONFIG_NET_POLL_CONTROLLER - .ndo_poll_controller = t1_netpoll, -#endif }; static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) diff --git a/drivers/net/ethernet/chelsio/cxgb/sge.c b/drivers/net/ethernet/chelsio/cxgb/sge.c index 2d9c2b5a690a..d6df1a87db0b 100644 --- a/drivers/net/ethernet/chelsio/cxgb/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb/sge.c @@ -1609,7 +1609,14 @@ static int process_pure_responses(struct adapter *adapter) int t1_poll(struct napi_struct *napi, int budget) { struct adapter *adapter = container_of(napi, struct adapter, napi); - int work_done = process_responses(adapter, budget); + int work_done = 0; + + if (budget) + work_done = process_responses(adapter, budget); + else { + /* budget=0 means: don't poll rx data */ + process_pure_responses(adapter); + } if (likely(work_done < budget)) { napi_complete_done(napi, work_done); From patchwork Thu Dec 24 13:11:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ahmed S. Darwish" X-Patchwork-Id: 352223 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6D0A7C4332D for ; Thu, 24 Dec 2020 13:12:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3ED5D206E5 for ; Thu, 24 Dec 2020 13:12:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728728AbgLXNMt (ORCPT ); Thu, 24 Dec 2020 08:12:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45654 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728033AbgLXNMs (ORCPT ); Thu, 24 Dec 2020 08:12:48 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE9DBC0617A6; Thu, 24 Dec 2020 05:12:07 -0800 (PST) From: "Ahmed S. Darwish" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1608815525; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2tkRs/sqATWLBVr8H6+Nv7Ft2PLbbPXnN1/yqJwLWw8=; b=S0XpGe2BHQMzo4lomRpk5bqY92nMehYU5K8wPmbED9WrAYHVFhQ9J9eGWEiMXutYMa6fsD aMjHTe6qxGsl+4VxRIbD/L2i8fwCzhX6J4YrdoGMC91SIF0LwBaFe/7WMa0N4ddFVFnq0z 3Wc/RapKsGLTXtK/NQe+Ky9NxzIOmBYuMiIDsFcUxEi2oqRtPKigrmITGVArBT+YMwAWEM oFQG5sEBz2qQznt1VRymO4mx/9jdmDPuIBe+LngLVTH7ra70nYadeNqcPL5Yaq4Q7Ji9Uy Q0We4X+/ByH1ZT2dNHdg8oewzUHhUdhxBXTW3SOEMMiqKaPptnAb65X0+3qIuQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1608815525; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2tkRs/sqATWLBVr8H6+Nv7Ft2PLbbPXnN1/yqJwLWw8=; b=JfBLTWbLKwti3koIsxv+8W/960n1keowKXnWwSInhlmi0ZwEQKiH3c1rOj4lkrZxq0diuW c7zk88NLlkiqsfDA== To: Rahul Lakkireddy , Rohit Maheshwari , Vinay Kumar Yadav , Vishal Kulkarni , netdev@vger.kernel.org Cc: "David S. Miller" , Jakub Kicinski , LKML , Thomas Gleixner , "Sebastian A. Siewior" , "Ahmed S. Darwish" Subject: [RFC PATCH 3/3] chelsio: cxgb: Do not schedule a workqueue for external interrupts Date: Thu, 24 Dec 2020 14:11:48 +0100 Message-Id: <20201224131148.300691-4-a.darwish@linutronix.de> In-Reply-To: <20201224131148.300691-1-a.darwish@linutronix.de> References: <20201224131148.300691-1-a.darwish@linutronix.de> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org cxgb's "elmer0" external interrupt handling code requires task context, so originally a workqueue was scheduled for it from the hardirq handler. Now that all of the external interrupt handling, elmer0 included, is run from a threaded-irq context, just directly call the real handler. Remove all the workqueue code that is now no longer needed, including the spinlock used for synchronizing the workqueue's NIC regsiters access against the irq handler. Signed-off-by: Ahmed S. Darwish --- drivers/net/ethernet/chelsio/cxgb/common.h | 2 -- drivers/net/ethernet/chelsio/cxgb/cxgb2.c | 38 ---------------------- drivers/net/ethernet/chelsio/cxgb/sge.c | 3 -- drivers/net/ethernet/chelsio/cxgb/subr.c | 2 +- 4 files changed, 1 insertion(+), 44 deletions(-) diff --git a/drivers/net/ethernet/chelsio/cxgb/common.h b/drivers/net/ethernet/chelsio/cxgb/common.h index 6475060649e9..504882e66831 100644 --- a/drivers/net/ethernet/chelsio/cxgb/common.h +++ b/drivers/net/ethernet/chelsio/cxgb/common.h @@ -238,7 +238,6 @@ struct adapter { int msg_enable; u32 mmio_len; - struct work_struct ext_intr_handler_task; struct adapter_params params; /* Terminator modules. */ @@ -256,7 +255,6 @@ struct adapter { spinlock_t mac_lock; /* guards async operations */ - spinlock_t async_lock ____cacheline_aligned; u32 slow_intr_mask; int t1powersave; }; diff --git a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c index c96bdca4f270..b93e86d4d079 100644 --- a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c +++ b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c @@ -905,41 +905,6 @@ static void mac_stats_task(struct work_struct *work) spin_unlock(&adapter->work_lock); } -/* - * Processes elmer0 external interrupts in process context. - */ -static void ext_intr_task(struct work_struct *work) -{ - struct adapter *adapter = - container_of(work, struct adapter, ext_intr_handler_task); - - t1_elmer0_ext_intr_handler(adapter); - - /* Now reenable external interrupts */ - spin_lock_irq(&adapter->async_lock); - adapter->slow_intr_mask |= F_PL_INTR_EXT; - writel(F_PL_INTR_EXT, adapter->regs + A_PL_CAUSE); - writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, - adapter->regs + A_PL_ENABLE); - spin_unlock_irq(&adapter->async_lock); -} - -/* - * Interrupt-context handler for elmer0 external interrupts. - */ -void t1_elmer0_ext_intr(struct adapter *adapter) -{ - /* - * Schedule a task to handle external interrupts as we require - * a process context. We disable EXT interrupts in the interim - * and let the task reenable them when it's done. - */ - adapter->slow_intr_mask &= ~F_PL_INTR_EXT; - writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, - adapter->regs + A_PL_ENABLE); - schedule_work(&adapter->ext_intr_handler_task); -} - void t1_fatal_err(struct adapter *adapter) { if (adapter->flags & FULL_INIT_DONE) { @@ -1045,11 +1010,8 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) spin_lock_init(&adapter->tpi_lock); spin_lock_init(&adapter->work_lock); - spin_lock_init(&adapter->async_lock); spin_lock_init(&adapter->mac_lock); - INIT_WORK(&adapter->ext_intr_handler_task, - ext_intr_task); INIT_DELAYED_WORK(&adapter->stats_update_task, mac_stats_task); diff --git a/drivers/net/ethernet/chelsio/cxgb/sge.c b/drivers/net/ethernet/chelsio/cxgb/sge.c index f1c402f6b889..9b4ffddbbc05 100644 --- a/drivers/net/ethernet/chelsio/cxgb/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb/sge.c @@ -1657,10 +1657,7 @@ irqreturn_t t1_irq_thread(int irq, void *data) struct sge *sge = adapter->sge; int handled; - spin_lock(&adapter->async_lock); handled = t1_slow_intr_handler(adapter); - spin_unlock(&adapter->async_lock); - if (!handled) sge->stats.unhandled_irqs++; diff --git a/drivers/net/ethernet/chelsio/cxgb/subr.c b/drivers/net/ethernet/chelsio/cxgb/subr.c index ea0f8741d7cf..197d3bb924ca 100644 --- a/drivers/net/ethernet/chelsio/cxgb/subr.c +++ b/drivers/net/ethernet/chelsio/cxgb/subr.c @@ -858,7 +858,7 @@ static int asic_slow_intr(adapter_t *adapter) if (cause & F_PL_INTR_PCIX) t1_pci_intr_handler(adapter); if (cause & F_PL_INTR_EXT) - t1_elmer0_ext_intr(adapter); + t1_elmer0_ext_intr_handler(adapter); /* Clear the interrupts just processed. */ writel(cause, adapter->regs + A_PL_CAUSE);