lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Sat,  5 Dec 2020 22:44:07 -0500
From:   Sven Van Asbroeck <>
To:     Bryan Whitehead <>,
        Microchip Linux Driver Support <>,
        David S Miller <>,
        Jakub Kicinski <>
Cc:     Sven Van Asbroeck <>,
        Andrew Lunn <>,,
Subject: [PATCH net v1 1/2] lan743x: improve performance: fix rx_napi_poll/interrupt ping-pong

From: Sven Van Asbroeck <>

Even if the rx ring is completely full, and there is more rx data
waiting on the chip, the rx napi poll fn will never run more than
once - it will always immediately bail out and re-enable interrupts.
Which results in ping-pong between napi and interrupt.

This defeats the purpose of napi, and is bad for performance.

Fix by addressing two separate issues:

1. Ensure the rx napi poll fn always updates the rx ring tail
   when returning, even when not re-enabling interrupts.

2. Up to half of elements in a full rx ring are extension
   frames, which do not generate any skbs. Limit the default
   napi weight to the smallest no. of skbs that can be generated
   by a full rx ring.

Tested-by: Sven Van Asbroeck <> # lan7430
Signed-off-by: Sven Van Asbroeck <>

Tree: git:// # 905b2032fa42

To: Bryan Whitehead <>
To: Microchip Linux Driver Support <>
To: "David S. Miller" <>
To: Jakub Kicinski <>
Cc: Andrew Lunn <>

 drivers/net/ethernet/microchip/lan743x_main.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index 87b6c59a1e03..ebb5e0bc516b 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -2260,10 +2260,11 @@ static int lan743x_rx_napi_poll(struct napi_struct *napi, int weight)
 	/* update RX_TAIL */
 	lan743x_csr_write(adapter, RX_TAIL(rx->channel_number),
 			  rx_tail_flags | rx->last_tail);
 	return count;
@@ -2405,9 +2406,15 @@ static int lan743x_rx_open(struct lan743x_rx *rx)
 	if (ret)
 		goto return_error;
+	/* up to half of elements in a full rx ring are
+	 * extension frames. these do not generate skbs.
+	 * to prevent napi/interrupt ping-pong, limit default
+	 * weight to the smallest no. of skbs that can be
+	 * generated by a full rx ring.
+	 */
 		       &rx->napi, lan743x_rx_napi_poll,
-		       rx->ring_size - 1);
+		       (rx->ring_size - 1) / 2);
 	lan743x_csr_write(adapter, DMAC_CMD,

Powered by blists - more mailing lists