From 213eaed3bdd3da827063425207a578903f20784d Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Thu, 23 Sep 2021 09:25:49 -0700 Subject: [PATCH] nvme_fuzz: pass trid on command line only Previously the Transport IDs would need to be an ini-style config file that the nvme_fuzz app would then parse. Instead just add a -F option that tells the nvme_fuzz app which subsystem(s) to fuzz. This simplifies the fuzz_app code a bit and makes it a bit easier to use. Signed-off-by: Jim Harris Change-Id: I622f5173ff36e15d653155c4eb7eaaecb5564818 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9603 Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Tomasz Zawadzki --- test/app/fuzz/nvme_fuzz/nvme_fuzz.c | 84 ++++++----------------------- test/fuzz/autofuzz_nvmf.sh | 8 ++- test/nvmf/target/fuzz.sh | 10 ++-- 3 files changed, 24 insertions(+), 78 deletions(-) diff --git a/test/app/fuzz/nvme_fuzz/nvme_fuzz.c b/test/app/fuzz/nvme_fuzz/nvme_fuzz.c index 67436fcdc4..73682c6b0b 100644 --- a/test/app/fuzz/nvme_fuzz/nvme_fuzz.c +++ b/test/app/fuzz/nvme_fuzz/nvme_fuzz.c @@ -46,7 +46,6 @@ #define UNIQUE_OPCODES 256 const char g_nvme_cmd_json_name[] = "struct spdk_nvme_cmd"; -char *g_conf_file; char *g_json_file = NULL; uint64_t g_runtime_ticks; unsigned int g_seed_value = 0; @@ -784,70 +783,12 @@ out: spdk_app_stop(rc); } -static int -parse_trids(void) -{ - struct spdk_conf *config = NULL; - struct spdk_conf_section *sp; - const char *trid_char; - struct nvme_fuzz_trid *current_trid; - int num_subsystems = 0; - int rc = 0; - - if (g_conf_file) { - config = spdk_conf_allocate(); - if (!config) { - fprintf(stderr, "Unable to allocate an spdk_conf object\n"); - return -1; - } - - rc = spdk_conf_read(config, g_conf_file); - if (rc) { - fprintf(stderr, "Unable to convert the conf file into a readable system\n"); - rc = -1; - goto exit; - } - - sp = spdk_conf_find_section(config, "Nvme"); - - if (sp == NULL) { - fprintf(stderr, "No Nvme configuration in conf file\n"); - goto exit; - } - - while ((trid_char = spdk_conf_section_get_nmval(sp, "TransportID", num_subsystems, 0)) != NULL) { - current_trid = malloc(sizeof(struct nvme_fuzz_trid)); - if (!current_trid) { - fprintf(stderr, "Unable to allocate memory for transport ID\n"); - rc = -1; - goto exit; - } - rc = spdk_nvme_transport_id_parse(¤t_trid->trid, trid_char); - - if (rc < 0) { - fprintf(stderr, "failed to parse transport ID: %s\n", trid_char); - free(current_trid); - rc = -1; - goto exit; - } - TAILQ_INSERT_TAIL(&g_trid_list, current_trid, tailq); - num_subsystems++; - } - } - -exit: - if (config != NULL) { - spdk_conf_free(config); - } - return rc; -} - static void nvme_fuzz_usage(void) { fprintf(stderr, " -a Perform admin commands. if -j is specified, \ only admin commands will run. Otherwise they will be run in tandem with I/O commands.\n"); - fprintf(stderr, " -C Path to a configuration file.\n"); + fprintf(stderr, " -F Transport ID for subsystem that should be fuzzed.\n"); fprintf(stderr, " -j Path to a json file containing named objects of type spdk_nvme_cmd. If this option is specified, -t will be ignored.\n"); fprintf(stderr, " -N Target only valid namespace with commands. \ @@ -861,14 +802,27 @@ This helps dig deeper into other errors besides invalid namespace.\n"); static int nvme_fuzz_parse(int ch, char *arg) { + struct nvme_fuzz_trid *trid; int64_t error_test; + int rc; switch (ch) { case 'a': g_run_admin_commands = true; break; - case 'C': - g_conf_file = optarg; + case 'F': + trid = malloc(sizeof(*trid)); + if (!trid) { + fprintf(stderr, "Unable to allocate memory for transport ID\n"); + return -1; + } + rc = spdk_nvme_transport_id_parse(&trid->trid, optarg); + if (rc < 0) { + fprintf(stderr, "failed to parse transport ID: %s\n", optarg); + free(trid); + return -1; + } + TAILQ_INSERT_TAIL(&g_trid_list, trid, tailq); break; case 'j': g_json_file = optarg; @@ -914,15 +868,11 @@ main(int argc, char **argv) g_runtime = DEFAULT_RUNTIME; g_run = true; - if ((rc = spdk_app_parse_args(argc, argv, &opts, "aC:j:NS:t:V", NULL, nvme_fuzz_parse, + if ((rc = spdk_app_parse_args(argc, argv, &opts, "aF:j:NS:t:V", NULL, nvme_fuzz_parse, nvme_fuzz_usage) != SPDK_APP_PARSE_ARGS_SUCCESS)) { return rc; } - if (g_conf_file) { - parse_trids(); - } - if (g_json_file != NULL) { g_cmd_array_size = fuzz_parse_args_into_array(g_json_file, (void **)&g_cmd_array, sizeof(struct spdk_nvme_cmd), g_nvme_cmd_json_name, parse_nvme_cmd_obj); diff --git a/test/fuzz/autofuzz_nvmf.sh b/test/fuzz/autofuzz_nvmf.sh index 6fc36e23b6..a9b447552d 100755 --- a/test/fuzz/autofuzz_nvmf.sh +++ b/test/fuzz/autofuzz_nvmf.sh @@ -22,13 +22,12 @@ nvmftestinit timing_enter nvmf_fuzz_test -echo "[Nvme]" > $testdir/nvmf_fuzz.conf -echo " TransportID \"trtype:$TEST_TRANSPORT adrfam:IPv4 subnqn:nqn.2016-06.io.spdk:cnode1 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT\" Nvme0" >> $testdir/nvmf_fuzz.conf +trid="trtype:$TEST_TRANSPORT adrfam:IPv4 subnqn:nqn.2016-06.io.spdk:cnode1 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" "${NVMF_APP[@]}" -m 0xF &> "$output_dir/nvmf_autofuzz_tgt_output.txt" & nvmfpid=$! -trap 'process_shm --id $NVMF_APP_SHM_ID; rm -f $testdir/nvmf_fuzz.conf; killprocess $nvmfpid; nvmftestfini $1; exit 1' SIGINT SIGTERM EXIT +trap 'process_shm --id $NVMF_APP_SHM_ID; killprocess $nvmfpid; nvmftestfini $1; exit 1' SIGINT SIGTERM EXIT waitforlisten $nvmfpid $rpc_py nvmf_create_transport -t $TEST_TRANSPORT -u 8192 @@ -40,9 +39,8 @@ $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc0 $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT # Note that we chose a consistent seed to ensure that this test is consistent in nightly builds. -$rootdir/test/app/fuzz/nvme_fuzz/nvme_fuzz -m 0xF0 -r "/var/tmp/nvme_fuzz" -t $TEST_TIMEOUT -C $testdir/nvmf_fuzz.conf -N -a 2> $output_dir/nvmf_autofuzz_logs.txt +$rootdir/test/app/fuzz/nvme_fuzz/nvme_fuzz -m 0xF0 -r "/var/tmp/nvme_fuzz" -t $TEST_TIMEOUT -F "$trid" -N -a 2> $output_dir/nvmf_autofuzz_logs.txt -rm -f $testdir/nvmf_fuzz.conf $rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 trap - SIGINT SIGTERM EXIT diff --git a/test/nvmf/target/fuzz.sh b/test/nvmf/target/fuzz.sh index 5a18be856f..3cd3341faf 100755 --- a/test/nvmf/target/fuzz.sh +++ b/test/nvmf/target/fuzz.sh @@ -12,7 +12,7 @@ nvmftestinit "${NVMF_APP[@]}" -m 0xF > $output_dir/nvmf_fuzz_tgt_output.txt 2>&1 & nvmfpid=$! -trap 'process_shm --id $NVMF_APP_SHM_ID; rm -f $testdir/nvmf_fuzz.conf; killprocess $nvmfpid; nvmftestfini $1; exit 1' SIGINT SIGTERM EXIT +trap 'process_shm --id $NVMF_APP_SHM_ID; killprocess $nvmfpid; nvmftestfini $1; exit 1' SIGINT SIGTERM EXIT waitforlisten $nvmfpid $rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 @@ -23,15 +23,13 @@ $rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK0000000000000 $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc0 $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT -echo "[Nvme]" > $testdir/nvmf_fuzz.conf -echo " TransportID \"trtype:$TEST_TRANSPORT adrfam:IPv4 subnqn:nqn.2016-06.io.spdk:cnode1 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT\" Nvme0" >> $testdir/nvmf_fuzz.conf +trid="trtype:$TEST_TRANSPORT adrfam:IPv4 subnqn:nqn.2016-06.io.spdk:cnode1 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" # Note that we chose a consistent seed to ensure that this test is consistent in nightly builds. -$rootdir/test/app/fuzz/nvme_fuzz/nvme_fuzz -m 0xF0 -r "/var/tmp/nvme_fuzz" -t 30 -S 123456 -C $testdir/nvmf_fuzz.conf -N -a 2> $output_dir/nvmf_fuzz_logs1.txt +$rootdir/test/app/fuzz/nvme_fuzz/nvme_fuzz -m 0xF0 -r "/var/tmp/nvme_fuzz" -t 30 -S 123456 -F "$trid" -N -a 2> $output_dir/nvmf_fuzz_logs1.txt # We don't specify a seed for this test. Instead we run a static list of commands from example.json. -$rootdir/test/app/fuzz/nvme_fuzz/nvme_fuzz -m 0xF0 -r "/var/tmp/nvme_fuzz" -C $testdir/nvmf_fuzz.conf -j $rootdir/test/app/fuzz/nvme_fuzz/example.json -a 2> $output_dir/nvmf_fuzz_logs2.txt +$rootdir/test/app/fuzz/nvme_fuzz/nvme_fuzz -m 0xF0 -r "/var/tmp/nvme_fuzz" -F "$trid" -j $rootdir/test/app/fuzz/nvme_fuzz/example.json -a 2> $output_dir/nvmf_fuzz_logs2.txt -rm -f $testdir/nvmf_fuzz.conf $rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 trap - SIGINT SIGTERM EXIT