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:
parent
36728cd80d
commit
e3997dc23b
@ -67,6 +67,7 @@ struct spdk_fio_options {
|
|||||||
char *json_conf;
|
char *json_conf;
|
||||||
unsigned mem_mb;
|
unsigned mem_mb;
|
||||||
int mem_single_seg;
|
int mem_single_seg;
|
||||||
|
int initial_zone_reset;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct spdk_fio_request {
|
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 int spdk_fio_init(struct thread_data *td);
|
||||||
static void spdk_fio_cleanup(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 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_t g_init_thread_id = 0;
|
||||||
static pthread_mutex_t g_init_mtx = PTHREAD_MUTEX_INITIALIZER;
|
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) {
|
for_each_file(td, f, i) {
|
||||||
struct spdk_bdev *bdev;
|
struct spdk_bdev *bdev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (strcmp(f->file_name, "*") == 0) {
|
if (strcmp(f->file_name, "*") == 0) {
|
||||||
continue;
|
continue;
|
||||||
@ -485,6 +489,10 @@ spdk_fio_setup(struct thread_data *td)
|
|||||||
f->real_file_size = spdk_bdev_get_num_blocks(bdev) *
|
f->real_file_size = spdk_bdev_get_num_blocks(bdev) *
|
||||||
spdk_bdev_get_block_size(bdev);
|
spdk_bdev_get_block_size(bdev);
|
||||||
|
|
||||||
|
rc = spdk_fio_handle_options(td, f, bdev);
|
||||||
|
if (rc) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1022,6 +1030,30 @@ spdk_fio_reset_wp(struct thread_data *td, struct fio_file *f, uint64_t offset, u
|
|||||||
}
|
}
|
||||||
#endif
|
#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[] = {
|
static struct fio_option options[] = {
|
||||||
{
|
{
|
||||||
.name = "spdk_conf",
|
.name = "spdk_conf",
|
||||||
@ -1060,6 +1092,16 @@ static struct fio_option options[] = {
|
|||||||
.category = FIO_OPT_C_ENGINE,
|
.category = FIO_OPT_C_ENGINE,
|
||||||
.group = FIO_OPT_G_INVALID,
|
.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,
|
.name = NULL,
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user