On Wed, Aug 09, 2023 at 02:43:39PM +0200, Magnus Karlsson wrote: > From: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> > > Add a command line option (-l) that lists all the tests. The number > before the test will be used in the next commit for specifying a > single test to run. Here is an example of the output: I was thinking whether we should have a way of combining -l with -m, but I believe there is only a single test currently that can not be run in ZC mode (rx dropped) ? > > Tests: > 0: SEND_RECEIVE > 1: SEND_RECEIVE_2K_FRAME > 2: SEND_RECEIVE_SINGLE_PKT > 3: POLL_RX > 4: POLL_TX > 5: POLL_RXQ_FULL > 6: POLL_TXQ_FULL > 7: SEND_RECEIVE_UNALIGNED > : > : > > Signed-off-by: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> > --- > tools/testing/selftests/bpf/test_xsk.sh | 11 +++++++++- > tools/testing/selftests/bpf/xsk_prereqs.sh | 10 +++++---- > tools/testing/selftests/bpf/xskxceiver.c | 24 ++++++++++++++++++++-- > 3 files changed, 38 insertions(+), 7 deletions(-) > > diff --git a/tools/testing/selftests/bpf/test_xsk.sh b/tools/testing/selftests/bpf/test_xsk.sh > index 4ec621f4d3db..00a504f0929a 100755 > --- a/tools/testing/selftests/bpf/test_xsk.sh > +++ b/tools/testing/selftests/bpf/test_xsk.sh > @@ -81,13 +81,14 @@ > > ETH="" > > -while getopts "vi:dm:" flag > +while getopts "vi:dm:l" flag > do > case "${flag}" in > v) verbose=1;; > d) debug=1;; > i) ETH=${OPTARG};; > m) MODE=${OPTARG};; > + l) list=1;; > esac > done > > @@ -157,6 +158,10 @@ if [[ $verbose -eq 1 ]]; then > ARGS+="-v " > fi > > +if [[ $list -eq 1 ]]; then > + ARGS+="-l " > +fi > + > if [ ! -z $MODE ]; then > ARGS+="-m ${MODE} " > fi > @@ -183,6 +188,10 @@ else > cleanup_iface ${ETH} ${MTU} > fi > > +if [[ $list -eq 1 ]]; then > + exit > +fi > + > TEST_NAME="XSK_SELFTESTS_${VETH0}_BUSY_POLL" > busy_poll=1 > > diff --git a/tools/testing/selftests/bpf/xsk_prereqs.sh b/tools/testing/selftests/bpf/xsk_prereqs.sh > index 29175682c44d..47c7b8064f38 100755 > --- a/tools/testing/selftests/bpf/xsk_prereqs.sh > +++ b/tools/testing/selftests/bpf/xsk_prereqs.sh > @@ -83,9 +83,11 @@ exec_xskxceiver() > fi > > ./${XSKOBJ} -i ${VETH0} -i ${VETH1} ${ARGS} > - > retval=$? > - test_status $retval "${TEST_NAME}" > - statusList+=($retval) > - nameList+=(${TEST_NAME}) > + > + if [[ $list -ne 1 ]]; then > + test_status $retval "${TEST_NAME}" > + statusList+=($retval) > + nameList+=(${TEST_NAME}) > + fi > } > diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/bpf/xskxceiver.c > index b1d0c69f21b8..a063b9af7fff 100644 > --- a/tools/testing/selftests/bpf/xskxceiver.c > +++ b/tools/testing/selftests/bpf/xskxceiver.c > @@ -108,6 +108,7 @@ static const char *MAC1 = "\x00\x0A\x56\x9E\xEE\x62"; > static const char *MAC2 = "\x00\x0A\x56\x9E\xEE\x61"; > > static bool opt_verbose; > +static bool opt_print_tests; > static enum test_mode opt_mode = TEST_MODE_ALL; > > static void __exit_with_error(int error, const char *file, const char *func, int line) > @@ -314,6 +315,7 @@ static struct option long_options[] = { > {"busy-poll", no_argument, 0, 'b'}, > {"verbose", no_argument, 0, 'v'}, > {"mode", required_argument, 0, 'm'}, > + {"list", no_argument, 0, 'l'}, > {0, 0, 0, 0} > }; > > @@ -325,7 +327,8 @@ static void usage(const char *prog) > " -i, --interface Use interface\n" > " -v, --verbose Verbose output\n" > " -b, --busy-poll Enable busy poll\n" > - " -m, --mode Run only mode skb, drv, or zc\n"; > + " -m, --mode Run only mode skb, drv, or zc\n" > + " -l, --list List all available tests\n"; > > ksft_print_msg(str, prog); > } > @@ -347,7 +350,7 @@ static void parse_command_line(struct ifobject *ifobj_tx, struct ifobject *ifobj > opterr = 0; > > for (;;) { > - c = getopt_long(argc, argv, "i:vbm:", long_options, &option_index); > + c = getopt_long(argc, argv, "i:vbm:l", long_options, &option_index); > if (c == -1) > break; > > @@ -391,6 +394,9 @@ static void parse_command_line(struct ifobject *ifobj_tx, struct ifobject *ifobj > ksft_exit_xfail(); > } > break; > + case 'l': > + opt_print_tests = true; > + break; > default: > usage(basename(argv[0])); > ksft_exit_xfail(); > @@ -2310,6 +2316,15 @@ static const struct test_spec tests[] = { > {.name = "TOO_MANY_FRAGS", .test_func = testapp_too_many_frags}, > }; > > +static void print_tests(void) > +{ > + u32 i; > + > + printf("Tests:\n"); > + for (i = 0; i < ARRAY_SIZE(tests); i++) Nit: I believe you can do for (u32 i = 0; i < ARRAY_SIZE(tests); i++) > + printf("%u: %s\n", i, tests[i].name); > +} > + > int main(int argc, char **argv) > { > struct pkt_stream *rx_pkt_stream_default; > @@ -2334,6 +2349,11 @@ int main(int argc, char **argv) > > parse_command_line(ifobj_tx, ifobj_rx, argc, argv); > > + if (opt_print_tests) { > + print_tests(); > + ksft_exit_xpass(); > + } > + > shared_netdev = (ifobj_tx->ifindex == ifobj_rx->ifindex); > ifobj_tx->shared_umem = shared_netdev; > ifobj_rx->shared_umem = shared_netdev; > -- > 2.34.1 >