Takashi Iwai 26adf6
From eed913f6919e253f35d454b2f115f2a4db2b741a Mon Sep 17 00:00:00 2001
Takashi Iwai 26adf6
From: Akihiko Odaki <akihiko.odaki@daynix.com>
Takashi Iwai 26adf6
Date: Fri, 28 Oct 2022 22:00:00 +0900
Takashi Iwai 26adf6
Subject: [PATCH] e1000e: Fix TX dispatch condition
Takashi Iwai 26adf6
Git-commit: eed913f6919e253f35d454b2f115f2a4db2b741a
Takashi Iwai 26adf6
Patch-mainline: v6.1
Takashi Iwai 26adf6
References: git-fixes
Takashi Iwai 26adf6
Takashi Iwai 26adf6
e1000_xmit_frame is expected to stop the queue and dispatch frames to
Takashi Iwai 26adf6
hardware if there is not sufficient space for the next frame in the
Takashi Iwai 26adf6
buffer, but sometimes it failed to do so because the estimated maximum
Takashi Iwai 26adf6
size of frame was wrong. As the consequence, the later invocation of
Takashi Iwai 26adf6
e1000_xmit_frame failed with NETDEV_TX_BUSY, and the frame in the buffer
Takashi Iwai 26adf6
remained forever, resulting in a watchdog failure.
Takashi Iwai 26adf6
Takashi Iwai 26adf6
This change fixes the estimated size by making it match with the
Takashi Iwai 26adf6
condition for NETDEV_TX_BUSY. Apparently, the old estimation failed to
Takashi Iwai 26adf6
account for the following lines which determines the space requirement
Takashi Iwai 26adf6
for not causing NETDEV_TX_BUSY:
Takashi Iwai 26adf6
    ```
Takashi Iwai 26adf6
    	/* reserve a descriptor for the offload context */
Takashi Iwai 26adf6
    	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
Takashi Iwai 26adf6
    		count++;
Takashi Iwai 26adf6
    	count++;
Takashi Iwai 26adf6
Takashi Iwai 26adf6
    	count += DIV_ROUND_UP(len, adapter->tx_fifo_limit);
Takashi Iwai 26adf6
    ```
Takashi Iwai 26adf6
Takashi Iwai 26adf6
This issue was found when running http-stress02 test included in Linux
Takashi Iwai 26adf6
Test Project 20220930 on QEMU with the following commandline:
Takashi Iwai 26adf6
```
Takashi Iwai 26adf6
qemu-system-x86_64 -M q35,accel=kvm -m 8G -smp 8
Takashi Iwai 26adf6
	-drive if=virtio,format=raw,file=root.img,file.locking=on
Takashi Iwai 26adf6
	-device e1000e,netdev=netdev
Takashi Iwai 26adf6
	-netdev tap,script=ifup,downscript=no,id=netdev
Takashi Iwai 26adf6
```
Takashi Iwai 26adf6
Takashi Iwai 26adf6
Fixes: bc7f75fa9788 ("[E1000E]: New pci-express e1000 driver (currently for ICH9 devices only)")
Takashi Iwai 26adf6
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Takashi Iwai 26adf6
Tested-by: Gurucharan G <gurucharanx.g@intel.com> (A Contingent worker at Intel)
Takashi Iwai 26adf6
Tested-by: Naama Meir <naamax.meir@linux.intel.com>
Takashi Iwai 26adf6
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Takashi Iwai 26adf6
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 26adf6
Takashi Iwai 26adf6
---
Takashi Iwai 26adf6
 drivers/net/ethernet/intel/e1000e/netdev.c | 4 ++--
Takashi Iwai 26adf6
 1 file changed, 2 insertions(+), 2 deletions(-)
Takashi Iwai 26adf6
Takashi Iwai 26adf6
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
Takashi Iwai 26adf6
index 49e926959ad3..55cf2f62bb30 100644
Takashi Iwai 26adf6
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
Takashi Iwai 26adf6
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
Takashi Iwai 26adf6
@@ -5936,9 +5936,9 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
Takashi Iwai 26adf6
 		e1000_tx_queue(tx_ring, tx_flags, count);
Takashi Iwai 26adf6
 		/* Make sure there is space in the ring for the next send. */
Takashi Iwai 26adf6
 		e1000_maybe_stop_tx(tx_ring,
Takashi Iwai 26adf6
-				    (MAX_SKB_FRAGS *
Takashi Iwai 26adf6
+				    ((MAX_SKB_FRAGS + 1) *
Takashi Iwai 26adf6
 				     DIV_ROUND_UP(PAGE_SIZE,
Takashi Iwai 26adf6
-						  adapter->tx_fifo_limit) + 2));
Takashi Iwai 26adf6
+						  adapter->tx_fifo_limit) + 4));
Takashi Iwai 26adf6
 
Takashi Iwai 26adf6
 		if (!netdev_xmit_more() ||
Takashi Iwai 26adf6
 		    netif_xmit_stopped(netdev_get_tx_queue(netdev, 0))) {
Takashi Iwai 26adf6
-- 
Takashi Iwai 26adf6
2.35.3
Takashi Iwai 26adf6