numam-dpdk/drivers/net/ixgbe
Konstantin Ananyev 71f39b07b6 ixgbe: fix Tx hang when RS distance exceeds HW limit
One of the ways to reproduce the issue:

testpmd <EAL-OPTIONS> -- -i --txqflags=0
testpmd> set fwd txonly
testpmd> set txpkts 64,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
testpmd> set txsplit rand
testpmd> start

After some time TX on ixgbe queue will hang,
and all packet transmission on that queue will stop.

This bug was first reported and investigated by
Vlad Zolotarov <vladz@cloudius-systems.com>:
"We can reproduce this issue when stressed the xmit path with a lot of highly
fragmented TCP frames (packets with up to 33 fragments with non-headers
fragments as small as 4 bytes) with all offload features enabled."

The root cause is that ixgbe_xmit_pkts() in some cases violates the HW rule
that the distance between TDs with RS bit set should not exceed 40 TDs.

>From the latest 82599 spec update:
"When WTHRESH is set to zero, the software device driver should set the RS bit
in the Tx descriptors with the EOP bit set and at least once in the 40
descriptors."

The fix is to make sure that the distance between TDs with RS bit set
would never exceed HW limit.
As part of that fix, tx_rs_thresh for ixgbe PMD is not allowed to be greater
then to 32 to comply with HW restrictions.

With that fix slight slowdown for the full-featured ixgbe TX path
might be observed (from our testing - up to 4%).

ixgbe simple TX path is unaffected by that patch.

Reported-by: Vlad Zolotarov <vladz@cloudius-systems.com>
Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
2015-11-12 00:22:26 +01:00
..
base drivers: add warning note to base dirs 2015-08-11 00:22:41 +02:00
ixgbe_82599_bypass.c ixgbe: move to drivers/net/ 2015-05-22 16:06:22 +02:00
ixgbe_bypass_api.h ixgbe: move to drivers/net/ 2015-05-22 16:06:22 +02:00
ixgbe_bypass_defines.h ixgbe: move to drivers/net/ 2015-05-22 16:06:22 +02:00
ixgbe_bypass.c ixgbe: move to drivers/net/ 2015-05-22 16:06:22 +02:00
ixgbe_bypass.h ixgbe: move to drivers/net/ 2015-05-22 16:06:22 +02:00
ixgbe_ethdev.c ixgbe: fix Rx errors statistics for UDP checksum 2015-11-04 17:55:27 +01:00
ixgbe_ethdev.h ixgbe: reserve VFIO vector zero for misc interrupt 2015-11-04 15:27:41 +01:00
ixgbe_fdir.c ixgbe: check for supported flow director behaviors 2015-11-04 22:51:57 +01:00
ixgbe_logs.h drivers: allow pruning log during build 2015-07-30 20:16:04 +02:00
ixgbe_pf.c ixgbe: drop flow control frames from VF 2015-10-28 17:41:27 +01:00
ixgbe_regs.h ixgbe: add access to specific device info 2015-07-17 00:00:48 +02:00
ixgbe_rxtx_vec.c ixgbe: prefetch cacheline after pointer becomes valid 2015-10-28 17:19:25 +01:00
ixgbe_rxtx.c ixgbe: fix Tx hang when RS distance exceeds HW limit 2015-11-12 00:22:26 +01:00
ixgbe_rxtx.h ixgbe: get queue info and descriptor limits 2015-11-02 00:13:59 +01:00
Makefile ixgbe: remove Rx bulk allocation option 2015-07-26 12:40:09 +02:00
rte_pmd_ixgbe_version.map ixgbe: move to drivers/net/ 2015-05-22 16:06:22 +02:00