From 2ee7e22356fa9359ba0679f93f0e53f43d621c1c Mon Sep 17 00:00:00 2001 From: Mao Jiang Date: Thu, 2 Dec 2021 03:04:19 +0000 Subject: [PATCH] nvme/overhead: add vfio_user transport support Change-Id: Ib696c7787151e4898b63f57749bd134333e94a23 Signed-off-by: Mao Jiang Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10413 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Reviewed-by: Tomasz Zawadzki Reviewed-by: Changpeng Liu --- test/nvme/nvme.sh | 2 +- test/nvme/overhead/overhead.c | 66 ++++++++++++++++++++++++++---- test/nvmf/target/nvmf_vfio_user.sh | 2 + 3 files changed, 61 insertions(+), 9 deletions(-) diff --git a/test/nvme/nvme.sh b/test/nvme/nvme.sh index 9d28c451b..13dfe2b06 100755 --- a/test/nvme/nvme.sh +++ b/test/nvme/nvme.sh @@ -122,7 +122,7 @@ run_test "nvme_sgl" $testdir/sgl/sgl run_test "nvme_e2edp" $testdir/e2edp/nvme_dp run_test "nvme_reserve" $testdir/reserve/reserve run_test "nvme_err_injection" $testdir/err_injection/err_injection -run_test "nvme_overhead" $testdir/overhead/overhead -s 4096 -t 1 -H +run_test "nvme_overhead" $testdir/overhead/overhead -s 4096 -t 1 -H -i 0 run_test "nvme_arbitration" $SPDK_EXAMPLE_DIR/arbitration -t 3 -i 0 if [ $(uname) != "FreeBSD" ]; then diff --git a/test/nvme/overhead/overhead.c b/test/nvme/overhead/overhead.c index 1641824e8..7ea5898b3 100644 --- a/test/nvme/overhead/overhead.c +++ b/test/nvme/overhead/overhead.c @@ -40,6 +40,8 @@ #include "spdk/string.h" #include "spdk/nvme_intel.h" #include "spdk/histogram_data.h" +#include "spdk/string.h" +#include "spdk/log.h" #if HAVE_LIBAIO #include @@ -114,6 +116,8 @@ uint64_t g_tsc_complete_min = UINT64_MAX; uint64_t g_tsc_complete_max = 0; uint64_t g_io_completed = 0; +static struct spdk_nvme_transport_id g_trid = {}; + static void register_ns(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns *ns) { @@ -482,11 +486,21 @@ static void usage(char *program_name) #if HAVE_LIBAIO printf(" [AIO device(s)]..."); #endif - printf("\n"); + printf("\t\n"); + printf("\t[-d DPDK huge memory size in MB]\n"); printf("\t[-s io size in bytes]\n"); printf("\t[-t time in seconds]\n"); printf("\t\t(default: 1)]\n"); printf("\t[-H enable histograms]\n"); + printf("\t[-g use single file descriptor for DPDK memory segments]\n"); + printf("\t[-i shared memory group ID]\n"); + printf("\t[-r remote NVMe over Fabrics target address]\n"); +#ifdef DEBUG + printf("\t[-L enable debug logging]\n"); +#else + printf("\t[-L enable debug logging (flag disabled, must reconfigure with --enable-debug)\n"); +#endif + spdk_log_usage(stdout, "\t\t-L"); } static void @@ -541,16 +555,19 @@ print_stats(void) } static int -parse_args(int argc, char **argv) +parse_args(int argc, char **argv, struct spdk_env_opts *env_opts) { - int op; + int op, rc; long int val; /* default value */ g_io_size_bytes = 0; g_time_in_sec = 0; - while ((op = getopt(argc, argv, "hs:t:H")) != -1) { + spdk_nvme_trid_populate_transport(&g_trid, SPDK_NVME_TRANSPORT_PCIE); + snprintf(g_trid.subnqn, sizeof(g_trid.subnqn), "%s", SPDK_NVMF_DISCOVERY_NQN); + + while ((op = getopt(argc, argv, "d:ghi:r:s:t:HL:")) != -1) { switch (op) { case 'h': usage(argv[0]); @@ -574,6 +591,40 @@ parse_args(int argc, char **argv) case 'H': g_enable_histogram = true; break; + case 'i': + env_opts->shm_id = spdk_strtol(optarg, 10); + if (env_opts->shm_id < 0) { + fprintf(stderr, "Invalid shared memory ID\n"); + return env_opts->shm_id; + } + break; + case 'g': + env_opts->hugepage_single_segments = true; + break; + case 'r': + if (spdk_nvme_transport_id_parse(&g_trid, optarg) != 0) { + fprintf(stderr, "Error parsing transport address\n"); + return 1; + } + break; + case 'd': + env_opts->mem_size = spdk_strtol(optarg, 10); + if (env_opts->mem_size < 0) { + fprintf(stderr, "Invalid DPDK memory size\n"); + return env_opts->mem_size; + } + break; + case 'L': + rc = spdk_log_set_flag(optarg); + if (rc < 0) { + fprintf(stderr, "unknown flag\n"); + usage(argv[0]); + exit(EXIT_FAILURE); + } +#ifdef DEBUG + spdk_log_set_print_level(SPDK_LOG_DEBUG); +#endif + break; default: usage(argv[0]); return 1; @@ -627,7 +678,7 @@ register_controllers(void) { printf("Initializing NVMe Controllers\n"); - if (spdk_nvme_probe(NULL, NULL, probe_cb, attach_cb, NULL) != 0) { + if (spdk_nvme_probe(&g_trid, NULL, probe_cb, attach_cb, NULL) != 0) { fprintf(stderr, "spdk_nvme_probe() failed\n"); return 1; } @@ -672,15 +723,14 @@ int main(int argc, char **argv) int rc; struct spdk_env_opts opts; - rc = parse_args(argc, argv); + spdk_env_opts_init(&opts); + rc = parse_args(argc, argv, &opts); if (rc != 0) { return rc; } - spdk_env_opts_init(&opts); opts.name = "overhead"; opts.core_mask = "0x1"; - opts.shm_id = 0; if (spdk_env_init(&opts) < 0) { fprintf(stderr, "Unable to initialize SPDK env\n"); return 1; diff --git a/test/nvmf/target/nvmf_vfio_user.sh b/test/nvmf/target/nvmf_vfio_user.sh index 0b41589fb..cefa84dad 100755 --- a/test/nvmf/target/nvmf_vfio_user.sh +++ b/test/nvmf/target/nvmf_vfio_user.sh @@ -56,6 +56,8 @@ for i in $(seq 1 $NUM_DEVICES); do sleep 1 $nvmeappdir/deallocated_value/deallocated_value -g -d 256 -r "trtype:$TEST_TRANSPORT traddr:$test_traddr subnqn:$test_subnqn" sleep 1 + $nvmeappdir/overhead/overhead -s 4096 -t 1 -H -g -d 256 -r "trtype:$TEST_TRANSPORT traddr:$test_traddr subnqn:$test_subnqn" + sleep 1 done killprocess $nvmfpid