path: root/app
diff options
authorKonstantin Ananyev <>2015-11-10 13:48:21 +0000
committerThomas Monjalon <>2015-11-12 00:22:26 +0100
commit71f39b07b6856c5f7d1c1aae8e9e5866d2a9a974 (patch)
tree3beda085e6d9487403961ddb78afac7278ff5ee3 /app
parent79bec05b32b75ce38a916f0d7605f6cd448ea72b (diff)
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 <>: "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 <> Signed-off-by: Konstantin Ananyev <> Acked-by: Pablo de Lara <>
Diffstat (limited to 'app')
1 files changed, 4 insertions, 4 deletions
diff --git a/app/test/test_pmd_perf.c b/app/test/test_pmd_perf.c
index 1fd6843..ef9262c 100644
--- a/app/test/test_pmd_perf.c
+++ b/app/test/test_pmd_perf.c
@@ -841,10 +841,10 @@ test_set_rxtx_conf(cmdline_fixed_string_t mode)
port_conf.rxmode.enable_scatter = 0;
return 0;
} else if (!strcmp(mode, "scalar")) {
- /* bulk alloc rx, simple tx */
- tx_conf.txq_flags = 0xf01;
- tx_conf.tx_rs_thresh = 128;
- tx_conf.tx_free_thresh = 128;
+ /* bulk alloc rx, full-featured tx */
+ tx_conf.txq_flags = 0;
+ tx_conf.tx_rs_thresh = 32;
+ tx_conf.tx_free_thresh = 32;
port_conf.rxmode.hw_ip_checksum = 1;
port_conf.rxmode.enable_scatter = 0;
return 0;