Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/xsk: add option to only run tests in a single mode

Add an option -m on the command line that allows the user to run the
tests in a single mode instead of all of them. Valid modes are skb,
drv, and zc (zero-copy). An example:

To run test suite in drv mode only:

./test_xsk.sh -m drv

Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
Link: https://lore.kernel.org/r/20230914084900.492-4-magnus.karlsson@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Magnus Karlsson and committed by
Alexei Starovoitov
3956bc34 64370d7c

+47 -8
+9 -1
tools/testing/selftests/bpf/test_xsk.sh
··· 73 73 # 74 74 # Run test suite for physical device in loopback mode 75 75 # sudo ./test_xsk.sh -i IFACE 76 + # 77 + # Run test suite in a specific mode only [skb,drv,zc] 78 + # sudo ./test_xsk.sh -m MODE 76 79 77 80 . xsk_prereqs.sh 78 81 79 82 ETH="" 80 83 81 - while getopts "vi:d" flag 84 + while getopts "vi:dm:" flag 82 85 do 83 86 case "${flag}" in 84 87 v) verbose=1;; 85 88 d) debug=1;; 86 89 i) ETH=${OPTARG};; 90 + m) MODE=${OPTARG};; 87 91 esac 88 92 done 89 93 ··· 155 151 156 152 if [[ $verbose -eq 1 ]]; then 157 153 ARGS+="-v " 154 + fi 155 + 156 + if [ -n "$MODE" ]; then 157 + ARGS+="-m ${MODE} " 158 158 fi 159 159 160 160 retval=$?
+37 -4
tools/testing/selftests/bpf/xskxceiver.c
··· 107 107 static const char *MAC1 = "\x00\x0A\x56\x9E\xEE\x62"; 108 108 static const char *MAC2 = "\x00\x0A\x56\x9E\xEE\x61"; 109 109 110 + static bool opt_verbose; 111 + static enum test_mode opt_mode = TEST_MODE_ALL; 112 + 110 113 static void __exit_with_error(int error, const char *file, const char *func, int line) 111 114 { 112 115 ksft_test_result_fail("[%s:%s:%i]: ERROR: %d/\"%s\"\n", file, func, line, error, ··· 313 310 {"interface", required_argument, 0, 'i'}, 314 311 {"busy-poll", no_argument, 0, 'b'}, 315 312 {"verbose", no_argument, 0, 'v'}, 313 + {"mode", required_argument, 0, 'm'}, 316 314 {0, 0, 0, 0} 317 315 }; 318 316 319 317 static void usage(const char *prog) 320 318 { 321 319 const char *str = 322 - " Usage: %s [OPTIONS]\n" 320 + " Usage: xskxceiver [OPTIONS]\n" 323 321 " Options:\n" 324 322 " -i, --interface Use interface\n" 325 323 " -v, --verbose Verbose output\n" 326 - " -b, --busy-poll Enable busy poll\n"; 324 + " -b, --busy-poll Enable busy poll\n" 325 + " -m, --mode Run only mode skb, drv, or zc\n"; 327 326 328 327 ksft_print_msg(str, prog); 329 328 } ··· 347 342 opterr = 0; 348 343 349 344 for (;;) { 350 - c = getopt_long(argc, argv, "i:vb", long_options, &option_index); 345 + c = getopt_long(argc, argv, "i:vbm:", long_options, &option_index); 351 346 if (c == -1) 352 347 break; 353 348 ··· 375 370 case 'b': 376 371 ifobj_tx->busy_poll = true; 377 372 ifobj_rx->busy_poll = true; 373 + break; 374 + case 'm': 375 + if (!strncmp("skb", optarg, strlen(optarg))) { 376 + opt_mode = TEST_MODE_SKB; 377 + } else if (!strncmp("drv", optarg, strlen(optarg))) { 378 + opt_mode = TEST_MODE_DRV; 379 + } else if (!strncmp("zc", optarg, strlen(optarg))) { 380 + opt_mode = TEST_MODE_ZC; 381 + } else { 382 + usage(basename(argv[0])); 383 + ksft_exit_xfail(); 384 + } 378 385 break; 379 386 default: 380 387 usage(basename(argv[0])); ··· 2382 2365 test.tx_pkt_stream_default = tx_pkt_stream_default; 2383 2366 test.rx_pkt_stream_default = rx_pkt_stream_default; 2384 2367 2385 - ksft_set_plan(modes * TEST_TYPE_MAX); 2368 + if (opt_mode == TEST_MODE_ALL) { 2369 + ksft_set_plan(modes * TEST_TYPE_MAX); 2370 + } else { 2371 + if (opt_mode == TEST_MODE_DRV && modes <= TEST_MODE_DRV) { 2372 + ksft_print_msg("Error: XDP_DRV mode not supported.\n"); 2373 + ksft_exit_xfail(); 2374 + } 2375 + if (opt_mode == TEST_MODE_ZC && modes <= TEST_MODE_ZC) { 2376 + ksft_print_msg("Error: zero-copy mode not supported.\n"); 2377 + ksft_exit_xfail(); 2378 + } 2379 + 2380 + ksft_set_plan(TEST_TYPE_MAX); 2381 + } 2386 2382 2387 2383 for (i = 0; i < modes; i++) { 2384 + if (opt_mode != TEST_MODE_ALL && i != opt_mode) 2385 + continue; 2386 + 2388 2387 for (j = 0; j < TEST_TYPE_MAX; j++) { 2389 2388 test_spec_init(&test, ifobj_tx, ifobj_rx, i); 2390 2389 run_pkt_test(&test, i, j);
+1 -3
tools/testing/selftests/bpf/xskxceiver.h
··· 63 63 TEST_MODE_SKB, 64 64 TEST_MODE_DRV, 65 65 TEST_MODE_ZC, 66 - TEST_MODE_MAX 66 + TEST_MODE_ALL 67 67 }; 68 68 69 69 enum test_type { ··· 97 97 TEST_TYPE_TOO_MANY_FRAGS, 98 98 TEST_TYPE_MAX 99 99 }; 100 - 101 - static bool opt_verbose; 102 100 103 101 struct xsk_umem_info { 104 102 struct xsk_ring_prod fq;