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 <james.r.harris@intel.com> Change-Id: I622f5173ff36e15d653155c4eb7eaaecb5564818 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9603 Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
9c968f8e05
commit
213eaed3bd
@ -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> Path to a configuration file.\n");
|
||||
fprintf(stderr, " -F Transport ID for subsystem that should be fuzzed.\n");
|
||||
fprintf(stderr,
|
||||
" -j <path> 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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user