]> git.baikalelectronics.ru Git - kernel.git/commit
net: ethernet: fec: prevent tx starvation under high rx load
authorTobias Waldekranz <tobias@waldekranz.com>
Fri, 3 Jul 2020 14:10:58 +0000 (16:10 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 7 Jul 2020 22:25:05 +0000 (15:25 -0700)
commite9212978786f3e11e5215f192f6e3cf297353619
tree32cec9b7733825cc0f160c9964adb6ad651edbab
parent7d9abd0494de72ad052af72b8592d4e810fb4cb1
net: ethernet: fec: prevent tx starvation under high rx load

In the ISR, we poll the event register for the queues in need of
service and then enter polled mode. After this point, the event
register will never be read again until we exit polled mode.

In a scenario where a UDP flow is routed back out through the same
interface, i.e. "router-on-a-stick" we'll typically only see an rx
queue event initially. Once we start to process the incoming flow
we'll be locked polled mode, but we'll never clean the tx rings since
that event is never caught.

Eventually the netdev watchdog will trip, causing all buffers to be
dropped and then the process starts over again.

Rework the NAPI poll to keep trying to consome the entire budget as
long as new events are coming in, making sure to service all rx/tx
queues, in priority order, on each pass.

Fixes: d03b455b3965 ("net: fec: change data structure to support multiqueue")
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
Tested-by: Fugang Duan <fugang.duan@nxp.com>
Reviewed-by: Fugang Duan <fugang.duan@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/fec.h
drivers/net/ethernet/freescale/fec_main.c