Commit 7cc16c96 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

bdevperf: g_main_thread calls bdev_open() instead of job->thread



The following patches will enable no_metadata option to each bdev
and use new APIs to get metadata configuration.

Hence, it will be necessary to open bdev before getting metadata
configuration.

As a preparation, move bdev open and close operations from job->thread
to g_main_thread. set timeout should be called on the thread which
called bdev open. Hence, move set timeout operation too. Furthermore,
event notification should be redirected from g_main_thread to
job->thread.

Signed-off-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I3623e7c0ccc314932f79b78243be9ede0b8927b3
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/25143


Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 3c5c3d59
Loading
Loading
Loading
Loading
+31 −25
Original line number Diff line number Diff line
@@ -616,6 +616,10 @@ free_job_config(void)
static void
bdevperf_job_free(struct bdevperf_job *job)
{
	if (job->bdev_desc != NULL) {
		spdk_bdev_close(job->bdev_desc);
	}

	spdk_histogram_data_free(job->histogram);
	spdk_bit_array_free(&job->outstanding);
	spdk_bit_array_free(&job->random_map);
@@ -828,8 +832,15 @@ clean:
static void
bdevperf_job_end(void *ctx)
{
	struct bdevperf_job *job = ctx;

	assert(g_main_thread == spdk_get_thread());

	if (job->bdev_desc != NULL) {
		spdk_bdev_close(job->bdev_desc);
		job->bdev_desc = NULL;
	}

	if (--g_bdevperf.running_jobs == 0) {
		bdevperf_test_done(NULL);
	}
@@ -856,8 +867,7 @@ bdevperf_job_empty(struct bdevperf_job *job)
	spdk_bdev_channel_get_histogram(job->ch, bdevperf_channel_get_histogram_cb,
					job->histogram);
	spdk_put_io_channel(job->ch);
	spdk_bdev_close(job->bdev_desc);
	spdk_thread_send_msg(g_main_thread, bdevperf_job_end, NULL);
	spdk_thread_send_msg(g_main_thread, bdevperf_job_end, job);
}

static void
@@ -1493,8 +1503,6 @@ bdevperf_job_run(void *ctx)
							10 * SPDK_SEC_TO_USEC);
	}

	spdk_bdev_set_timeout(job->bdev_desc, g_timeout_in_sec, bdevperf_timeout_cb, job);

	for (i = 0; i < job->queue_depth; i++) {
		task = bdevperf_job_get_task(job);
		bdevperf_submit_single(job, task);
@@ -1631,18 +1639,26 @@ bdevperf_test(void)

	/* Iterate jobs to start all I/O */
	TAILQ_FOREACH(job, &g_bdevperf.jobs, link) {
		spdk_bdev_set_timeout(job->bdev_desc, g_timeout_in_sec, bdevperf_timeout_cb, job);

		g_bdevperf.running_jobs++;
		spdk_thread_send_msg(job->thread, bdevperf_job_run, job);
	}
}

static void
_bdevperf_job_drain(void *ctx)
{
	bdevperf_job_drain(ctx);
}

static void
bdevperf_bdev_removed(enum spdk_bdev_event_type type, struct spdk_bdev *bdev, void *event_ctx)
{
	struct bdevperf_job *job = event_ctx;

	if (SPDK_BDEV_EVENT_REMOVE == type) {
		bdevperf_job_drain(job);
		spdk_thread_send_msg(job->thread, _bdevperf_job_drain, job);
	}
}

@@ -1774,15 +1790,6 @@ static void
_bdevperf_construct_job(void *ctx)
{
	struct bdevperf_job *job = ctx;
	int rc;

	rc = spdk_bdev_open_ext(spdk_bdev_get_name(job->bdev), true, bdevperf_bdev_removed, job,
				&job->bdev_desc);
	if (rc != 0) {
		SPDK_ERRLOG("Could not open leaf bdev %s, error=%d\n", spdk_bdev_get_name(job->bdev), rc);
		g_run_rc = -EINVAL;
		goto end;
	}

	if (g_zcopy) {
		if (!spdk_bdev_io_type_supported(job->bdev, SPDK_BDEV_IO_TYPE_ZCOPY)) {
@@ -1794,9 +1801,7 @@ _bdevperf_construct_job(void *ctx)

	job->ch = spdk_bdev_get_io_channel(job->bdev_desc);
	if (!job->ch) {
		SPDK_ERRLOG("Could not get io_channel for device %s, error=%d\n", spdk_bdev_get_name(job->bdev),
			    rc);
		spdk_bdev_close(job->bdev_desc);
		SPDK_ERRLOG("Could not get io_channel for device %s\n", spdk_bdev_get_name(job->bdev));
		g_run_rc = -ENOMEM;
		goto end;
	}
@@ -1874,6 +1879,8 @@ bdevperf_construct_job(struct spdk_bdev *bdev, struct job_config *config,
		return -ENOMEM;
	}

	job->thread = thread;

	job->name = strdup(spdk_bdev_get_name(bdev));
	if (!job->name) {
		fprintf(stderr, "Unable to allocate memory for job name.\n");
@@ -1881,6 +1888,13 @@ bdevperf_construct_job(struct spdk_bdev *bdev, struct job_config *config,
		return -ENOMEM;
	}

	rc = spdk_bdev_open_ext(job->name, true, bdevperf_bdev_removed, job, &job->bdev_desc);
	if (rc != 0) {
		fprintf(stderr, "Could not open leaf bdev %s, error=%d\n", job->name, rc);
		bdevperf_job_free(job);
		return rc;
	}

	job->workload_type = config->rw;
	job->io_size = config->bs;
	job->rw_percentage = config->rwmixread;
@@ -2047,8 +2061,6 @@ bdevperf_construct_job(struct spdk_bdev *bdev, struct job_config *config,
		TAILQ_INSERT_TAIL(&job->task_list, task, link);
	}

	job->thread = thread;

	g_construct_job_count++;

	rc = spdk_thread_send_msg(thread, _bdevperf_construct_job, job);
@@ -2732,12 +2744,6 @@ rpc_error:
}
SPDK_RPC_REGISTER("perform_tests", rpc_perform_tests, SPDK_RPC_RUNTIME)

static void
_bdevperf_job_drain(void *ctx)
{
	bdevperf_job_drain(ctx);
}

static void
spdk_bdevperf_shutdown_cb(void)
{