bdev/fio_plugin: add support for --initial_zone_reset

--initial_zone_reset has to be done before fio creates its threads.
Since --zonemode=zbd only supports --create_serialize=1 (default),
this is possible.

Since this requires an I/O channel, and is called before threads
are created, follow the same pattern as spdk_fio_report_zones()
and simply initialize the thread early if this option is used.

Just like spdk_fio_report_zones(), thread cleanup has to be
called explicitly in case of error. (Since fio will only call
.cleanup() on threads that it has called .init() on.)

Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
Change-Id: I7d4dedce88309e4c6e5800ed3d56cd5ccb297551
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7726
Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Niklas Cassel 2021-05-03 14:48:25 +00:00 committed by Tomasz Zawadzki
parent 36728cd80d
commit e3997dc23b

View File

@ -67,6 +67,7 @@ struct spdk_fio_options {
char *json_conf;
unsigned mem_mb;
int mem_single_seg;
int initial_zone_reset;
};
struct spdk_fio_request {
@ -111,6 +112,8 @@ static const char *g_json_config_file = NULL;
static int spdk_fio_init(struct thread_data *td);
static void spdk_fio_cleanup(struct thread_data *td);
static size_t spdk_fio_poll_thread(struct spdk_fio_thread *fio_thread);
static int spdk_fio_handle_options(struct thread_data *td, struct fio_file *f,
struct spdk_bdev *bdev);
static pthread_t g_init_thread_id = 0;
static pthread_mutex_t g_init_mtx = PTHREAD_MUTEX_INITIALIZER;
@ -471,6 +474,7 @@ spdk_fio_setup(struct thread_data *td)
for_each_file(td, f, i) {
struct spdk_bdev *bdev;
int rc;
if (strcmp(f->file_name, "*") == 0) {
continue;
@ -485,6 +489,10 @@ spdk_fio_setup(struct thread_data *td)
f->real_file_size = spdk_bdev_get_num_blocks(bdev) *
spdk_bdev_get_block_size(bdev);
rc = spdk_fio_handle_options(td, f, bdev);
if (rc) {
return rc;
}
}
return 0;
@ -1022,6 +1030,30 @@ spdk_fio_reset_wp(struct thread_data *td, struct fio_file *f, uint64_t offset, u
}
#endif
static int
spdk_fio_handle_options(struct thread_data *td, struct fio_file *f, struct spdk_bdev *bdev)
{
struct spdk_fio_options *fio_options = td->eo;
if (fio_options->initial_zone_reset && spdk_bdev_is_zoned(bdev)) {
#if FIO_HAS_ZBD
int rc = spdk_fio_init(td);
if (rc) {
return rc;
}
rc = spdk_fio_reset_zones(td->io_ops_data, f->engine_data, 0, f->real_file_size);
if (rc) {
spdk_fio_cleanup(td);
return rc;
}
#else
SPDK_ERRLOG("fio version is too old to support zoned block devices\n");
#endif
}
return 0;
}
static struct fio_option options[] = {
{
.name = "spdk_conf",
@ -1060,6 +1092,16 @@ static struct fio_option options[] = {
.category = FIO_OPT_C_ENGINE,
.group = FIO_OPT_G_INVALID,
},
{
.name = "initial_zone_reset",
.lname = "Reset Zones on initialization",
.type = FIO_OPT_INT,
.off1 = offsetof(struct spdk_fio_options, initial_zone_reset),
.def = "0",
.help = "Reset Zones on initialization (0=disable, 1=Reset All Zones)",
.category = FIO_OPT_C_ENGINE,
.group = FIO_OPT_G_INVALID,
},
{
.name = NULL,
},