|
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 |
|