From patchwork Tue Dec 9 14:37:22 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sabrina Dubroca X-Patchwork-Id: 419110 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 3D5F21400D5 for ; Wed, 10 Dec 2014 01:39:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757333AbaLIOjr (ORCPT ); Tue, 9 Dec 2014 09:39:47 -0500 Received: from smtp2-g21.free.fr ([212.27.42.2]:54274 "EHLO smtp2-g21.free.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757255AbaLIOjp (ORCPT ); Tue, 9 Dec 2014 09:39:45 -0500 Received: from localhost (unknown [IPv6:2a01:e35:8b11:1410:922b:34ff:fed8:ca9b]) by smtp2-g21.free.fr (Postfix) with ESMTP id 74EC54B008E; Tue, 9 Dec 2014 15:39:08 +0100 (CET) From: Sabrina Dubroca To: davem@davemloft.net Cc: netdev@vger.kernel.org, Sabrina Dubroca Subject: [RFC PATCH net-next 11/11] net: fec: remove disable_irq from netpoll controller, use netpoll_irq_lock Date: Tue, 9 Dec 2014 15:37:22 +0100 Message-Id: <1418135842-21389-12-git-send-email-sd@queasysnail.net> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1418135842-21389-1-git-send-email-sd@queasysnail.net> References: <1418135842-21389-1-git-send-email-sd@queasysnail.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org disable_irq() may sleep, replace it with a spin_lock in the interrupt handler and netpoll controller. No actual testing done, only compiled. Signed-off-by: Sabrina Dubroca --- drivers/net/ethernet/freescale/fec.h | 2 ++ drivers/net/ethernet/freescale/fec_main.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 469691ad4a1e..fe8931465a53 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h @@ -16,6 +16,7 @@ #include #include #include +#include #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ @@ -509,6 +510,7 @@ struct fec_enet_private { int speed; struct completion mdio_done; int irq[FEC_IRQ_NUM]; + struct netpoll_irq_lock netpoll_locks[FEC_IRQ_NUM]; bool bufdesc_ex; int pause_flag; u32 quirks; diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index d2955ce24d0b..b7579c5acedb 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1558,6 +1558,18 @@ fec_enet_interrupt(int irq, void *dev_id) const unsigned napi_mask = FEC_ENET_RXF | FEC_ENET_TXF; uint int_events; irqreturn_t ret = IRQ_NONE; + int i; + struct netpoll_irq_lock *netpoll_lock = NULL; + + for (i = 0; i < FEC_IRQ_NUM; i++) { + if (fep->irq[i] == irq) { + netpoll_lock = &fep->netpoll_locks[i]; + netpoll_irq_lock(netpoll_lock); + break; + } + } + if (!netpoll_lock) + return ret; int_events = readl(fep->hwp + FEC_IEVENT); writel(int_events & ~napi_mask, fep->hwp + FEC_IEVENT); @@ -1579,6 +1591,7 @@ fec_enet_interrupt(int irq, void *dev_id) if (fep->ptp_clock) fec_ptp_check_pps_event(fep); + netpoll_irq_unlock(netpoll_lock); return ret; } @@ -3237,6 +3250,7 @@ fec_probe(struct platform_device *pdev) for (i = 0; i < FEC_IRQ_NUM; i++) { irq = platform_get_irq(pdev, i); + netpoll_irq_lock_init(&fep->netpoll_locks[i]); if (irq < 0) { if (i) break;