fio_plugin: add persistent fio_thread for spdk init/finish

This patch also replaces "temporary"
SPDK threads for init/finish with a
single persistent thread that's created
at the time of init, and destroyed
at the time of finish.

Change-Id: I6da922cb50f06a9c31e22817d06c5dcbf19255b6
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/386247
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Dariusz Stojaczyk 2017-11-08 15:53:32 +01:00 committed by Daniel Verkamp
parent 8865e0bf51
commit a658245f40

View File

@ -285,9 +285,6 @@ spdk_fio_init_env(struct thread_data *td)
count = spdk_fio_poll_thread(fio_thread); count = spdk_fio_poll_thread(fio_thread);
} while (!done || count > 0); } while (!done || count > 0);
/* Destroy the temporary SPDK thread */
spdk_fio_cleanup(td);
return 0; return 0;
} }
@ -390,9 +387,8 @@ spdk_fio_init(struct thread_data *td)
} }
static void static void
spdk_fio_cleanup(struct thread_data *td) spdk_fio_cleanup_thread(struct spdk_fio_thread *fio_thread)
{ {
struct spdk_fio_thread *fio_thread = td->io_ops_data;
struct spdk_fio_target *target, *tmp; struct spdk_fio_target *target, *tmp;
TAILQ_FOREACH_SAFE(target, &fio_thread->targets, link, tmp) { TAILQ_FOREACH_SAFE(target, &fio_thread->targets, link, tmp) {
@ -410,7 +406,14 @@ spdk_fio_cleanup(struct thread_data *td)
spdk_ring_free(fio_thread->ring); spdk_ring_free(fio_thread->ring);
free(fio_thread->iocq); free(fio_thread->iocq);
free(fio_thread); free(fio_thread);
}
static void
spdk_fio_cleanup(struct thread_data *td)
{
struct spdk_fio_thread *fio_thread = td->io_ops_data;
spdk_fio_cleanup_thread(fio_thread);
td->io_ops_data = NULL; td->io_ops_data = NULL;
} }
@ -672,25 +675,12 @@ static void
spdk_fio_finish_env(void) spdk_fio_finish_env(void)
{ {
struct spdk_fio_thread *fio_thread; struct spdk_fio_thread *fio_thread;
struct thread_data *td;
int rc;
bool done = false; bool done = false;
size_t count; size_t count;
td = calloc(1, sizeof(*td)); /* the same thread that called spdk_fio_init_env */
if (!td) { fio_thread = g_thread;
SPDK_ERRLOG("Unable to allocate thread_data\n");
return;
}
/* Create an SPDK thread temporarily */
rc = spdk_fio_init_thread(td);
if (rc < 0) {
SPDK_ERRLOG("Failed to create finish thread\n");
free(td);
return;
}
fio_thread = td->io_ops_data;
spdk_bdev_finish(spdk_fio_module_finish_done, &done); spdk_bdev_finish(spdk_fio_module_finish_done, &done);
do { do {
@ -704,9 +694,7 @@ spdk_fio_finish_env(void)
count = spdk_fio_poll_thread(fio_thread); count = spdk_fio_poll_thread(fio_thread);
} while (!done || count > 0); } while (!done || count > 0);
/* Destroy the temporary SPDK thread */ spdk_fio_cleanup_thread(fio_thread);
spdk_fio_cleanup(td);
free(td);
} }
static void fio_exit spdk_fio_unregister(void) static void fio_exit spdk_fio_unregister(void)