diff mbox series

[2/2] net: fec: optimize IRQ handler

Message ID 20171206172459.14059-2-l.stach@pengutronix.de
State Changes Requested, archived
Delegated to: David Miller
Headers show
Series [1/2] net: fec: don't ack masked interrupt events | expand

Commit Message

Lucas Stach Dec. 6, 2017, 5:24 p.m. UTC
fep->work_rx and fep->work_tx are both non-zero, as long as the NAPI
softirq hasn't finished its work. So if the current IRQ does not
signal any RX or TX completion, but some unrelated event, the path to
schedule the NAPI context is still entered.

The handler works correctly as in this case napi_schedule_prep() will
reject the scheduling attempt, but the flow can still be optimized by
not trying to schedule if the IRQ doesn't signal RX or TX completion.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/net/ethernet/freescale/fec_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Andy Duan Dec. 7, 2017, 3:02 a.m. UTC | #1
From: Lucas Stach <l.stach@pengutronix.de> Sent: Thursday, December 07, 2017 1:25 AM
>fep->work_rx and fep->work_tx are both non-zero, as long as the NAPI
>softirq hasn't finished its work. So if the current IRQ does not signal any RX or
>TX completion, but some unrelated event, the path to schedule the NAPI
>context is still entered.
>
>The handler works correctly as in this case napi_schedule_prep() will reject
>the scheduling attempt, but the flow can still be optimized by not trying to
>schedule if the IRQ doesn't signal RX or TX completion.
>
>Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
>---
> drivers/net/ethernet/freescale/fec_main.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
>diff --git a/drivers/net/ethernet/freescale/fec_main.c
>b/drivers/net/ethernet/freescale/fec_main.c
>index 0b70c07eb703..2043e140e9bd 100644
>--- a/drivers/net/ethernet/freescale/fec_main.c
>+++ b/drivers/net/ethernet/freescale/fec_main.c
>@@ -1587,14 +1587,14 @@ fec_enet_interrupt(int irq, void *dev_id)
> 	int_events = readl_relaxed(fep->hwp + FEC_IEVENT) &
> 	             readl_relaxed(fep->hwp + FEC_IMASK);
> 	writel(int_events, fep->hwp + FEC_IEVENT);
>-	fec_enet_collect_events(fep, int_events);
>
>-	if ((fep->work_tx || fep->work_rx) && fep->link) {
>+	if ((int_events & (FEC_ENET_RXF | FEC_ENET_TXF)) && fep->link) {
> 		ret = IRQ_HANDLED;
>
> 		if (napi_schedule_prep(&fep->napi)) {
> 			/* Disable the NAPI interrupts */
> 			writel(FEC_NAPI_IMASK, fep->hwp + FEC_IMASK);
>+			fec_enet_collect_events(fep, int_events);
> 			__napi_schedule(&fep->napi);
> 		}
> 	}
>--
>2.11.0

The patch seems fine, and patch#1 is better to cache imask as David's comment.  
Thanks.

Acked-by: Fugang Duan <fugang.duan@nxp.com>
diff mbox series

Patch

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 0b70c07eb703..2043e140e9bd 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1587,14 +1587,14 @@  fec_enet_interrupt(int irq, void *dev_id)
 	int_events = readl_relaxed(fep->hwp + FEC_IEVENT) &
 	             readl_relaxed(fep->hwp + FEC_IMASK);
 	writel(int_events, fep->hwp + FEC_IEVENT);
-	fec_enet_collect_events(fep, int_events);
 
-	if ((fep->work_tx || fep->work_rx) && fep->link) {
+	if ((int_events & (FEC_ENET_RXF | FEC_ENET_TXF)) && fep->link) {
 		ret = IRQ_HANDLED;
 
 		if (napi_schedule_prep(&fep->napi)) {
 			/* Disable the NAPI interrupts */
 			writel(FEC_NAPI_IMASK, fep->hwp + FEC_IMASK);
+			fec_enet_collect_events(fep, int_events);
 			__napi_schedule(&fep->napi);
 		}
 	}