All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
To: Magnus Karlsson <magnus.karlsson@gmail.com>
Cc: <magnus.karlsson@intel.com>, <bjorn@kernel.org>, <ast@kernel.org>,
	<daniel@iogearbox.net>, <netdev@vger.kernel.org>,
	<bpf@vger.kernel.org>, <yhs@fb.com>, <andrii@kernel.org>,
	<martin.lau@linux.dev>, <song@kernel.org>,
	<john.fastabend@gmail.com>, <kpsingh@kernel.org>,
	<sdf@google.com>, <haoluo@google.com>, <jolsa@kernel.org>,
	<przemyslaw.kitszel@intel.com>
Subject: Re: [PATCH bpf-next v3 07/10] selftests/xsk: add option to run single test
Date: Wed, 13 Sep 2023 19:14:56 +0200	[thread overview]
Message-ID: <ZQHuEATwIdONDg9o@boxer> (raw)
In-Reply-To: <20230913110248.30597-8-magnus.karlsson@gmail.com>

On Wed, Sep 13, 2023 at 01:02:29PM +0200, Magnus Karlsson wrote:
> From: Magnus Karlsson <magnus.karlsson@intel.com>
> 
> Add a command line option to be able to run a single test. This option
> (-t) takes a number from the list of tests available with the "-l"
> option. Here are two examples:
> 
> Run test number 2, the "receive single packet" test in all available modes:
> 
> ./test_xsk.sh -t 2
> 
> Run test number 21, the metadata copy test in skb mode only
> 
> ./test_xsh.sh -t 21 -m skb
> 
> Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
> ---
>  tools/testing/selftests/bpf/test_xsk.sh  | 10 +++-
>  tools/testing/selftests/bpf/xskxceiver.c | 59 +++++++++++++++++-------
>  tools/testing/selftests/bpf/xskxceiver.h |  3 ++
>  3 files changed, 55 insertions(+), 17 deletions(-)
> 
> diff --git a/tools/testing/selftests/bpf/test_xsk.sh b/tools/testing/selftests/bpf/test_xsk.sh
> index cb215a83b622..296006ea6e9c 100755
> --- a/tools/testing/selftests/bpf/test_xsk.sh
> +++ b/tools/testing/selftests/bpf/test_xsk.sh
> @@ -79,12 +79,15 @@
>  #
>  # List available tests
>  #   ./test_xsk.sh -l
> +#
> +# Run a specific test from the test suite
> +#   sudo ./test_xsk.sh -t TEST_NAME
>  
>  . xsk_prereqs.sh
>  
>  ETH=""
>  
> -while getopts "vi:dm:l" flag
> +while getopts "vi:dm:lt:" flag
>  do
>  	case "${flag}" in
>  		v) verbose=1;;
> @@ -92,6 +95,7 @@ do
>  		i) ETH=${OPTARG};;
>  		m) MODE=${OPTARG};;
>  		l) list=1;;
> +		t) TEST=${OPTARG};;
>  	esac
>  done
>  
> @@ -170,6 +174,10 @@ if [ -n "$MODE" ]; then
>  	ARGS+="-m ${MODE} "
>  fi
>  
> +if [ -n "$TEST" ]; then
> +	ARGS+="-t ${TEST} "
> +fi
> +
>  retval=$?
>  test_status $retval "${TEST_NAME}"
>  
> diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/bpf/xskxceiver.c
> index a063b9af7fff..4d5c53153465 100644
> --- a/tools/testing/selftests/bpf/xskxceiver.c
> +++ b/tools/testing/selftests/bpf/xskxceiver.c
> @@ -110,6 +110,7 @@ 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 u32 opt_run_test = RUN_ALL_TESTS;
>  
>  static void __exit_with_error(int error, const char *file, const char *func, int line)
>  {
> @@ -316,10 +317,11 @@ static struct option long_options[] = {
>  	{"verbose", no_argument, 0, 'v'},
>  	{"mode", required_argument, 0, 'm'},
>  	{"list", no_argument, 0, 'l'},
> +	{"test", required_argument, 0, 't'},
>  	{0, 0, 0, 0}
>  };
>  
> -static void usage(const char *prog)
> +static void print_usage(char **argv)
>  {
>  	const char *str =
>  		"  Usage: xskxceiver [OPTIONS]\n"
> @@ -328,9 +330,11 @@ static void usage(const char *prog)
>  		"  -v, --verbose        Verbose output\n"
>  		"  -b, --busy-poll      Enable busy poll\n"
>  		"  -m, --mode           Run only mode skb, drv, or zc\n"
> -		"  -l, --list           List all available tests\n";
> +		"  -l, --list           List all available tests\n"
> +		"  -t, --test           Run a specific test. Enter number from -l option.\n";
>  
> -	ksft_print_msg(str, prog);
> +	ksft_print_msg(str, basename(argv[0]));
> +	ksft_exit_xfail();
>  }
>  
>  static bool validate_interface(struct ifobject *ifobj)
> @@ -350,7 +354,7 @@ static void parse_command_line(struct ifobject *ifobj_tx, struct ifobject *ifobj
>  	opterr = 0;
>  
>  	for (;;) {
> -		c = getopt_long(argc, argv, "i:vbm:l", long_options, &option_index);
> +		c = getopt_long(argc, argv, "i:vbm:lt:", long_options, &option_index);
>  		if (c == -1)
>  			break;
>  
> @@ -390,16 +394,20 @@ static void parse_command_line(struct ifobject *ifobj_tx, struct ifobject *ifobj
>  								strlen("zc")))) {
>  				opt_mode = TEST_MODE_ZC;
>  			} else {
> -				usage(basename(argv[0]));
> -				ksft_exit_xfail();
> +				print_usage(argv);
>  			}
>  			break;
>  		case 'l':
>  			opt_print_tests = true;
>  			break;
> +		case 't':
> +			errno = 0;
> +			opt_run_test = strtol(optarg, NULL, 0);
> +			if (errno)
> +				print_usage(argv);
> +			break;
>  		default:
> -			usage(basename(argv[0]));
> -			ksft_exit_xfail();
> +			print_usage(argv);
>  		}
>  	}
>  }
> @@ -2330,8 +2338,8 @@ int main(int argc, char **argv)
>  	struct pkt_stream *rx_pkt_stream_default;
>  	struct pkt_stream *tx_pkt_stream_default;
>  	struct ifobject *ifobj_tx, *ifobj_rx;
> +	u32 i, j, failed_tests = 0, nb_tests;
>  	int modes = TEST_MODE_SKB + 1;
> -	u32 i, j, failed_tests = 0;
>  	struct test_spec test;
>  	bool shared_netdev;
>  
> @@ -2353,15 +2361,17 @@ int main(int argc, char **argv)
>  		print_tests();
>  		ksft_exit_xpass();
>  	}
> +	if (opt_run_test != RUN_ALL_TESTS && opt_run_test >= ARRAY_SIZE(tests)) {
> +		ksft_print_msg("Error: test %u does not exist.\n", opt_run_test);
> +		ksft_exit_xfail();
> +	}
>  
>  	shared_netdev = (ifobj_tx->ifindex == ifobj_rx->ifindex);
>  	ifobj_tx->shared_umem = shared_netdev;
>  	ifobj_rx->shared_umem = shared_netdev;
>  
> -	if (!validate_interface(ifobj_tx) || !validate_interface(ifobj_rx)) {
> -		usage(basename(argv[0]));
> -		ksft_exit_xfail();
> -	}
> +	if (!validate_interface(ifobj_tx) || !validate_interface(ifobj_rx))
> +		print_usage(argv);
>  
>  	if (is_xdp_supported(ifobj_tx->ifindex)) {
>  		modes++;
> @@ -2380,16 +2390,33 @@ int main(int argc, char **argv)
>  	test.tx_pkt_stream_default = tx_pkt_stream_default;
>  	test.rx_pkt_stream_default = rx_pkt_stream_default;
>  
> -	if (opt_mode == TEST_MODE_ALL)
> -		ksft_set_plan(modes * ARRAY_SIZE(tests));
> +	if (opt_run_test == RUN_ALL_TESTS)
> +		nb_tests = ARRAY_SIZE(tests);
>  	else
> -		ksft_set_plan(ARRAY_SIZE(tests));
> +		nb_tests = 1;
> +	if (opt_mode == TEST_MODE_ALL) {
> +		ksft_set_plan(modes * nb_tests);
> +	} else {
> +		if (opt_mode == TEST_MODE_DRV && modes <= TEST_MODE_DRV) {
> +			ksft_print_msg("Error: XDP_DRV mode not supported.\n");
> +			ksft_exit_xfail();
> +		}
> +		if (opt_mode == TEST_MODE_ZC && modes <= TEST_MODE_ZC) {
> +			ksft_print_msg("Error: zero-copy mode not supported.\n");
> +			ksft_exit_xfail();

shouldn't these checks go with patch 03?

> +		}
> +
> +		ksft_set_plan(nb_tests);
> +	}
>  
>  	for (i = 0; i < modes; i++) {
>  		if (opt_mode != TEST_MODE_ALL && i != opt_mode)
>  			continue;
>  
>  		for (j = 0; j < ARRAY_SIZE(tests); j++) {
> +			if (opt_run_test != RUN_ALL_TESTS && j != opt_run_test)
> +				continue;
> +
>  			test_spec_init(&test, ifobj_tx, ifobj_rx, i, &tests[j]);
>  			run_pkt_test(&test);
>  			usleep(USLEEP_MAX);
> diff --git a/tools/testing/selftests/bpf/xskxceiver.h b/tools/testing/selftests/bpf/xskxceiver.h
> index 3a71d490db3e..8015aeea839d 100644
> --- a/tools/testing/selftests/bpf/xskxceiver.h
> +++ b/tools/testing/selftests/bpf/xskxceiver.h
> @@ -5,6 +5,8 @@
>  #ifndef XSKXCEIVER_H_
>  #define XSKXCEIVER_H_
>  
> +#include <limits.h>
> +
>  #include "xsk_xdp_progs.skel.h"
>  
>  #ifndef SOL_XDP
> @@ -56,6 +58,7 @@
>  #define XSK_DESC__MAX_SKB_FRAGS 18
>  #define HUGEPAGE_SIZE (2 * 1024 * 1024)
>  #define PKT_DUMP_NB_TO_PRINT 16
> +#define RUN_ALL_TESTS UINT_MAX
>  
>  #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
>  
> -- 
> 2.42.0
> 

  reply	other threads:[~2023-09-13 17:15 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-13 11:02 [PATCH bpf-next v3 00/10] seltests/xsk: various improvements to xskxceiver Magnus Karlsson
2023-09-13 11:02 ` [PATCH bpf-next v3 01/10] selftests/xsk: print per packet info in verbose mode Magnus Karlsson
2023-09-13 11:02 ` [PATCH bpf-next v3 02/10] selftests/xsk: add timeout for Tx thread Magnus Karlsson
2023-09-13 11:02 ` [PATCH bpf-next v3 03/10] selftests/xsk: add option to only run tests in a single mode Magnus Karlsson
2023-09-13 17:12   ` Maciej Fijalkowski
2023-09-14  7:48     ` Magnus Karlsson
2023-09-13 11:02 ` [PATCH bpf-next v3 04/10] selftests/xsk: move all tests to separate functions Magnus Karlsson
2023-09-13 11:02 ` [PATCH bpf-next v3 05/10] selftests/xsk: declare test names in struct Magnus Karlsson
2023-09-13 11:02 ` [PATCH bpf-next v3 06/10] selftests/xsk: add option that lists all tests Magnus Karlsson
2023-09-13 11:02 ` [PATCH bpf-next v3 07/10] selftests/xsk: add option to run single test Magnus Karlsson
2023-09-13 17:14   ` Maciej Fijalkowski [this message]
2023-09-14  7:49     ` Magnus Karlsson
2023-09-13 11:02 ` [PATCH bpf-next v3 08/10] selftests/xsk: use ksft_print_msg uniformly Magnus Karlsson
2023-09-13 11:02 ` [PATCH bpf-next v3 09/10] selftests/xsk: fail single test instead of all tests Magnus Karlsson
2023-09-13 16:11   ` Maciej Fijalkowski
2023-09-13 11:02 ` [PATCH bpf-next v3 10/10] selftests/xsk: display command line options with -h Magnus Karlsson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZQHuEATwIdONDg9o@boxer \
    --to=maciej.fijalkowski@intel.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bjorn@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=haoluo@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=kpsingh@kernel.org \
    --cc=magnus.karlsson@gmail.com \
    --cc=magnus.karlsson@intel.com \
    --cc=martin.lau@linux.dev \
    --cc=netdev@vger.kernel.org \
    --cc=przemyslaw.kitszel@intel.com \
    --cc=sdf@google.com \
    --cc=song@kernel.org \
    --cc=yhs@fb.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.