From 13a0ac2e20935d6fd20983d989c50c4c4ce480fe Mon Sep 17 00:00:00 2001 From: Vitaliy Mysak Date: Thu, 23 Jul 2020 21:30:30 +0200 Subject: [PATCH] bdevperf: config file: simplify old constructors Instead of calling bdevperf_construct_job() directly, create a job_config instance that would express the same semantics and then use bdevperf_construct_config_jobs() to create and run actual jobs. The goal is to unify methods and reduce code duplication. Change-Id: I724e5788ea74868c9e9c8128d658e720d211f253 Signed-off-by: Vitaliy Mysak Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3510 Reviewed-by: Tomasz Zawadzki Reviewed-by: Ben Walker Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins --- test/bdev/bdevperf/bdevperf.c | 143 +++++++++++++++------------------- 1 file changed, 64 insertions(+), 79 deletions(-) diff --git a/test/bdev/bdevperf/bdevperf.c b/test/bdev/bdevperf/bdevperf.c index f3cabb4dd..0a1885fe7 100644 --- a/test/bdev/bdevperf/bdevperf.c +++ b/test/bdev/bdevperf/bdevperf.c @@ -1124,6 +1124,24 @@ construct_job_thread(struct spdk_cpuset *cpumask, const char *tag) return spdk_thread_create(thread_name, cpumask); } +static uint32_t +_get_next_core(void) +{ + static uint32_t current_core = SPDK_ENV_LCORE_ID_ANY; + + if (current_core == SPDK_ENV_LCORE_ID_ANY) { + current_core = spdk_env_get_first_core(); + return current_core; + } + + current_core = spdk_env_get_next_core(current_core); + if (current_core == SPDK_ENV_LCORE_ID_ANY) { + current_core = spdk_env_get_first_core(); + } + + return current_core; +} + static void _bdevperf_construct_job(void *ctx) { @@ -1151,7 +1169,7 @@ end: static int bdevperf_construct_job(struct spdk_bdev *bdev, struct job_config *config, - struct spdk_thread *thread, uint32_t offset, uint32_t length) + struct spdk_thread *thread) { struct bdevperf_job *job; struct bdevperf_task *task; @@ -1176,8 +1194,8 @@ bdevperf_construct_job(struct spdk_bdev *bdev, struct job_config *config, } job->workload_type = g_workload_type; - job->io_size = config ? config->bs : g_io_size; - job->rw_percentage = config ? config->rwmixread : g_rw_percentage; + job->io_size = config->bs; + job->rw_percentage = config->rwmixread; job->is_random = g_is_random; job->verify = g_verify; job->reset = g_reset; @@ -1186,7 +1204,7 @@ bdevperf_construct_job(struct spdk_bdev *bdev, struct job_config *config, job->write_zeroes = g_write_zeroes; job->flush = g_flush; job->abort = g_abort; - job->queue_depth = config ? config->iodepth : g_queue_depth; + job->queue_depth = config->iodepth; job->bdev = bdev; job->io_size_blocks = job->io_size / data_block_size; @@ -1216,10 +1234,10 @@ bdevperf_construct_job(struct spdk_bdev *bdev, struct job_config *config, job->offset_in_ios = 0; - if (length != 0) { + if (config->length != 0) { /* Use subset of disk */ - job->size_in_ios = length / job->io_size_blocks; - job->ios_base = offset / job->io_size_blocks; + job->size_in_ios = config->length / job->io_size_blocks; + job->ios_base = config->offset / job->io_size_blocks; } else { /* Use whole disk */ job->size_in_ios = spdk_bdev_get_num_blocks(bdev) / job->io_size_blocks; @@ -1309,7 +1327,7 @@ bdevperf_construct_config_jobs(void) thread = construct_job_thread(&config->cpumask, config->name); assert(thread); - rc = bdevperf_construct_job(bdev, config, thread, config->offset, config->length); + rc = bdevperf_construct_job(bdev, config, thread); if (rc < 0) { g_run_rc = rc; return; @@ -1317,17 +1335,38 @@ bdevperf_construct_config_jobs(void) } } +static int +make_cli_job_config(const char *filename, int offset, int range) +{ + struct job_config *config = calloc(1, sizeof(*config)); + + if (config == NULL) { + fprintf(stderr, "Unable to allocate memory for job config\n"); + return -ENOMEM; + } + + config->name = filename; + config->filename = filename; + spdk_cpuset_zero(&config->cpumask); + spdk_cpuset_set_cpu(&config->cpumask, _get_next_core(), true); + config->bs = g_io_size; + config->iodepth = g_queue_depth; + config->rwmixread = g_rw_percentage; + config->offset = offset; + config->length = range; + + TAILQ_INSERT_TAIL(&job_config_list, config, link); + return 0; +} + static void bdevperf_construct_multithread_jobs(void) { struct spdk_bdev *bdev; uint32_t i; - struct spdk_cpuset cpumask; - struct spdk_thread *thread; uint32_t num_cores; uint32_t blocks_per_job; uint32_t offset; - int rc; num_cores = 0; SPDK_ENV_FOREACH_CORE(i) { @@ -1350,16 +1389,9 @@ bdevperf_construct_multithread_jobs(void) offset = 0; SPDK_ENV_FOREACH_CORE(i) { - spdk_cpuset_zero(&cpumask); - spdk_cpuset_set_cpu(&cpumask, i, true); - thread = construct_job_thread(&cpumask, spdk_bdev_get_name(bdev)); - assert(thread); - - /* Construct the job */ - rc = bdevperf_construct_job(bdev, NULL, thread, offset, blocks_per_job); - if (rc < 0) { - g_run_rc = rc; - break; + g_run_rc = make_cli_job_config(g_job_bdev_name, offset, blocks_per_job); + if (g_run_rc) { + return; } offset += blocks_per_job; @@ -1371,56 +1403,24 @@ bdevperf_construct_multithread_jobs(void) offset = 0; SPDK_ENV_FOREACH_CORE(i) { - spdk_cpuset_zero(&cpumask); - spdk_cpuset_set_cpu(&cpumask, i, true); - thread = construct_job_thread(&cpumask, spdk_bdev_get_name(bdev)); - assert(thread); - - /* Construct the job */ - rc = bdevperf_construct_job(bdev, NULL, thread, offset, blocks_per_job); - if (rc < 0) { - g_run_rc = rc; - break; + g_run_rc = make_cli_job_config(spdk_bdev_get_name(bdev), + offset, blocks_per_job); + if (g_run_rc) { + return; } offset += blocks_per_job; } - if (g_run_rc != 0) { - break; - } - bdev = spdk_bdev_next_leaf(bdev); } } } -static uint32_t -_get_next_core(void) -{ - static uint32_t current_core = SPDK_ENV_LCORE_ID_ANY; - - if (current_core == SPDK_ENV_LCORE_ID_ANY) { - current_core = spdk_env_get_first_core(); - return current_core; - } - - current_core = spdk_env_get_next_core(current_core); - if (current_core == SPDK_ENV_LCORE_ID_ANY) { - current_core = spdk_env_get_first_core(); - } - - return current_core; -} - static void bdevperf_construct_jobs(void) { struct spdk_bdev *bdev; - uint32_t lcore; - struct spdk_cpuset cpumask; - struct spdk_thread *thread; - int rc; /* There are three different modes for allocating jobs. Standard mode * (the default) creates one spdk_thread per bdev and runs the I/O job there. @@ -1441,7 +1441,6 @@ bdevperf_construct_jobs(void) g_construct_job_count = 1; if (g_bdevperf_conf) { - bdevperf_construct_config_jobs(); goto end; } else if (g_multithread_mode) { bdevperf_construct_multithread_jobs(); @@ -1451,18 +1450,8 @@ bdevperf_construct_jobs(void) if (g_job_bdev_name != NULL) { bdev = spdk_bdev_get_by_name(g_job_bdev_name); if (bdev) { - lcore = _get_next_core(); - - spdk_cpuset_zero(&cpumask); - spdk_cpuset_set_cpu(&cpumask, lcore, true); - thread = construct_job_thread(&cpumask, spdk_bdev_get_name(bdev)); - assert(thread); - /* Construct the job */ - rc = bdevperf_construct_job(bdev, NULL, thread, 0, 0); - if (rc < 0) { - g_run_rc = rc; - } + g_run_rc = make_cli_job_config(g_job_bdev_name, 0, 0); } else { fprintf(stderr, "Unable to find bdev '%s'\n", g_job_bdev_name); } @@ -1470,17 +1459,9 @@ bdevperf_construct_jobs(void) bdev = spdk_bdev_first_leaf(); while (bdev != NULL) { - lcore = _get_next_core(); - - spdk_cpuset_zero(&cpumask); - spdk_cpuset_set_cpu(&cpumask, lcore, true); - thread = construct_job_thread(&cpumask, spdk_bdev_get_name(bdev)); - assert(thread); - /* Construct the job */ - rc = bdevperf_construct_job(bdev, NULL, thread, 0, 0); - if (rc < 0) { - g_run_rc = rc; + g_run_rc = make_cli_job_config(spdk_bdev_get_name(bdev), 0, 0); + if (g_run_rc) { break; } @@ -1489,6 +1470,10 @@ bdevperf_construct_jobs(void) } end: + if (g_run_rc == 0) { + bdevperf_construct_config_jobs(); + } + if (--g_construct_job_count == 0) { if (g_run_rc != 0) { /* Something failed. */