From: Willem de Bruijn Add two pacing hardware offload variants 1. one that uses FQ to safely offload when within bounds. 2. one that uses pfifo_fast and thus forwards all packets. Verify that the packets are paced in hardware with new flag '-h'. Also move the ip version check to the main test_so_txtime callee, rather than having to add checks to the new variants. Also increase test timeout to 2 min. This suite now counts 58 tests, which each take 2 sec to stabilize when run with KSFT_MACHINE_SLOW. When increasing the bound, do so with a sizable headroom. Also increase rcvtimeout significantly to reduce flakiness. Signed-off-by: Willem de Bruijn --- Changes v1 -> v2 - re-raise NlError from e (patchwork pylint) - simplify expect_pass test (patchwork pylint) v1: https://lore.kernel.org/netdev/20260706133433.3142805-7-willemdebruijn.kernel@gmail.com/ --- tools/testing/selftests/drivers/net/settings | 1 + .../testing/selftests/drivers/net/so_txtime.c | 2 +- .../selftests/drivers/net/so_txtime.py | 72 +++++++++++++++++-- 3 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 tools/testing/selftests/drivers/net/settings diff --git a/tools/testing/selftests/drivers/net/settings b/tools/testing/selftests/drivers/net/settings new file mode 100644 index 000000000000..b478e684846a --- /dev/null +++ b/tools/testing/selftests/drivers/net/settings @@ -0,0 +1 @@ +timeout=240 diff --git a/tools/testing/selftests/drivers/net/so_txtime.c b/tools/testing/selftests/drivers/net/so_txtime.c index 5900ca97957c..6e64baa4c60d 100644 --- a/tools/testing/selftests/drivers/net/so_txtime.c +++ b/tools/testing/selftests/drivers/net/so_txtime.c @@ -375,7 +375,7 @@ static int setup_tx(struct sockaddr *addr, socklen_t alen) static int setup_rx(struct sockaddr *addr, socklen_t alen) { - struct timeval tv = { .tv_usec = 100 * 1000 }; + struct timeval tv = { .tv_usec = 600 * 1000 }; int fd; fd = socket(addr->sa_family, SOCK_DGRAM, 0); diff --git a/tools/testing/selftests/drivers/net/so_txtime.py b/tools/testing/selftests/drivers/net/so_txtime.py index adf6c848d6d8..7b75a33f5c43 100755 --- a/tools/testing/selftests/drivers/net/so_txtime.py +++ b/tools/testing/selftests/drivers/net/so_txtime.py @@ -12,10 +12,13 @@ import time from lib.py import ksft_exit, ksft_run, ksft_variants from lib.py import KsftNamedVariant, KsftSkipEx from lib.py import NetDrvEpEnv, bkg, cmd, defer, tc +from lib.py import EthtoolFamily, NlError def test_so_txtime(cfg, clockid, ipver, args_tx, args_rx, expect_success): """Main function. Run so_txtime as sender and receiver.""" + cfg.require_ipver(ipver) + slow_machine = os.environ.get('KSFT_MACHINE_SLOW') if not hasattr(cfg, "bin_remote"): @@ -38,6 +41,34 @@ def test_so_txtime(cfg, clockid, ipver, args_tx, args_rx, expect_success): cmd(cmd_tx) +def _dev_setup_pacing_offload(cfg): + """Configure pacing-offload-horizon.""" + ethnl = EthtoolFamily() + + try: + rings = ethnl.rings_get({'header': {'dev-index': cfg.ifindex}}) + except NlError as e: + raise KsftSkipEx('ring-get not supported by device') from e + + if 'pacing-offload-horizon' not in rings or \ + 'pacing-offload-horizon-max' not in rings: + raise KsftSkipEx('pacing offload horizon not supported by device') + + if rings['pacing-offload-horizon-max'] < 50_000: + raise KsftSkipEx('pacing offload max horizon too small') + + cur_horizon = rings['pacing-offload-horizon'] + new_horizon = 50_000 + ethnl.rings_set({ + 'header': {'dev-index': cfg.ifindex}, + 'pacing-offload-horizon': new_horizon, + }) + defer(ethnl.rings_set, { + 'header': {'dev-index': cfg.ifindex}, + 'pacing-offload-horizon': cur_horizon + }) + + def _qdisc_setup(ifname, qdisc, optargs=""): """Replace root qdisc. Restore the original after the test. @@ -56,6 +87,7 @@ def _test_variants_fq(): ["one_pkt", "a,10", "a,10"], ["in_order", "a,10,b,20", "a,10,b,20"], ["reverse_order", "a,20,b,10", "b,10,a,20"], + ["beyond_hw_horizon", "a,70", "a,70"], ]: name = f"v{ipver}_{testcase[0]}" yield KsftNamedVariant(name, ipver, testcase[1], testcase[2]) @@ -64,15 +96,42 @@ def _test_variants_fq(): @ksft_variants(_test_variants_fq()) def test_so_txtime_fq_mono(cfg, ipver, args_tx, args_rx): """Run all variants of monotonic (fq) tests.""" - cfg.require_ipver(ipver) _qdisc_setup(cfg.ifname, "fq") test_so_txtime(cfg, "mono", ipver, args_tx, args_rx, True) +@ksft_variants(_test_variants_fq()) +def test_so_txtime_fq_mono_hw(cfg, ipver, args_tx, args_rx): + """Run all variants of monotonic fq tests, with offload horizon.""" + cfg.require_nsim(nsim_test=False) + + _dev_setup_pacing_offload(cfg) + try: + _qdisc_setup(cfg.ifname, "fq", "offload_horizon 50ms") + except Exception as e: + raise KsftSkipEx("netdev does not support offload. skipping") from e + + # Expect all tests to use only hw pacing, except beyond_hw_horizon. + hw_only = "-h" if args_tx != "a,70" else "" + test_so_txtime(cfg, "mono", ipver, f"{hw_only} {args_tx}", args_rx, True) + + +@ksft_variants(_test_variants_fq()) +def test_so_txtime_pfifofast_mono_hw(cfg, ipver, args_tx, args_rx): + """Run all variants of monotonic tests, without fq pacing sw backup.""" + cfg.require_nsim(nsim_test=False) + + _dev_setup_pacing_offload(cfg) + _qdisc_setup(cfg.ifname, "pfifo_fast") + + # Expect all tests to pass, except beyond_hw_horizon without sw fallback. + expect_pass = not args_tx == "a,70" + test_so_txtime(cfg, "mono", ipver, f"-h {args_tx}", args_rx, expect_pass) + + @ksft_variants(_test_variants_fq()) def test_so_txtime_fq_tai(cfg, ipver, args_tx, args_rx): """Run all variants of fq tests, but pass CLOCK_TAI to test conversion.""" - cfg.require_ipver(ipver) _qdisc_setup(cfg.ifname, "fq") test_so_txtime(cfg, "tai", ipver, args_tx, args_rx, True) @@ -95,7 +154,6 @@ def _test_variants_etf(): @ksft_variants(_test_variants_etf()) def test_so_txtime_etf(cfg, ipver, args_tx, args_rx, expect_fail): """Run all variants of etf tests.""" - cfg.require_ipver(ipver) try: _qdisc_setup(cfg.ifname, "etf", "clockid CLOCK_TAI delta 400000") except Exception as e: @@ -108,7 +166,13 @@ def main() -> None: """Boilerplate ksft main.""" with NetDrvEpEnv(__file__) as cfg: ksft_run( - [test_so_txtime_fq_mono, test_so_txtime_fq_tai, test_so_txtime_etf], + [ + test_so_txtime_fq_mono, + test_so_txtime_fq_mono_hw, + test_so_txtime_pfifofast_mono_hw, + test_so_txtime_fq_tai, + test_so_txtime_etf, + ], args=(cfg,), ) ksft_exit() -- 2.55.0.229.g6434b31f56-goog