X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=zbd.c;h=eed796b3217d297eb94942b28b4cfbf0ab5113ab;hb=30bec59eab3908b681cbc2866179f7166a849c83;hp=20e610c40ef5272d894afa581e9f97eb6f9db59c;hpb=1ddd225e0b56f9d23c97ce99a18bae9cba5331a7;p=fio.git diff --git a/zbd.c b/zbd.c index 20e610c4..eed796b3 100644 --- a/zbd.c +++ b/zbd.c @@ -647,7 +647,7 @@ static bool zbd_open_zone(struct thread_data *td, const struct fio_file *f, static int zbd_reset_zone(struct thread_data *td, struct fio_file *f, struct fio_zone_info *z); -int zbd_setup_files(struct thread_data *td) +int zbd_init_files(struct thread_data *td) { struct fio_file *f; int i; @@ -656,6 +656,44 @@ int zbd_setup_files(struct thread_data *td) if (zbd_init_zone_info(td, f)) return 1; } + return 0; +} + +void zbd_recalc_options_with_zone_granularity(struct thread_data *td) +{ + struct fio_file *f; + int i; + + for_each_file(td, f, i) { + struct zoned_block_device_info *zbd = f->zbd_info; + // zonemode=strided doesn't get per-file zone size. + uint64_t zone_size = zbd ? zbd->zone_size : td->o.zone_size; + + if (zone_size == 0) + continue; + + if (td->o.size_nz > 0) { + td->o.size = td->o.size_nz * zone_size; + } + if (td->o.io_size_nz > 0) { + td->o.io_size = td->o.io_size_nz * zone_size; + } + if (td->o.start_offset_nz > 0) { + td->o.start_offset = td->o.start_offset_nz * zone_size; + } + if (td->o.offset_increment_nz > 0) { + td->o.offset_increment = td->o.offset_increment_nz * zone_size; + } + if (td->o.zone_skip_nz > 0) { + td->o.zone_skip = td->o.zone_skip_nz * zone_size; + } + } +} + +int zbd_setup_files(struct thread_data *td) +{ + struct fio_file *f; + int i; if (!zbd_using_direct_io()) { log_err("Using direct I/O is mandatory for writing to ZBD drives\n\n"); @@ -804,16 +842,13 @@ static void zbd_close_zone(struct thread_data *td, const struct fio_file *f, * @f: fio file for which to reset zones * @zb: first zone to reset. * @ze: first zone not to reset. - * @all_zones: whether to reset all zones or only those zones for which the - * write pointer is not a multiple of td->o.min_bs[DDIR_WRITE]. */ static int zbd_reset_zones(struct thread_data *td, struct fio_file *f, struct fio_zone_info *const zb, - struct fio_zone_info *const ze, bool all_zones) + struct fio_zone_info *const ze) { struct fio_zone_info *z; const uint32_t min_bs = td->o.min_bs[DDIR_WRITE]; - bool reset_wp; int res = 0; assert(min_bs); @@ -826,16 +861,10 @@ static int zbd_reset_zones(struct thread_data *td, struct fio_file *f, if (!z->has_wp) continue; zone_lock(td, f, z); - if (all_zones) { - pthread_mutex_lock(&f->zbd_info->mutex); - zbd_close_zone(td, f, nz); - pthread_mutex_unlock(&f->zbd_info->mutex); - - reset_wp = z->wp != z->start; - } else { - reset_wp = z->wp % min_bs != 0; - } - if (reset_wp) { + pthread_mutex_lock(&f->zbd_info->mutex); + zbd_close_zone(td, f, nz); + pthread_mutex_unlock(&f->zbd_info->mutex); + if (z->wp != z->start) { dprint(FD_ZBD, "%s: resetting zone %u\n", f->file_name, zbd_zone_nr(f, z)); if (zbd_reset_zone(td, f, z) < 0) @@ -958,8 +987,8 @@ void zbd_file_reset(struct thread_data *td, struct fio_file *f) * writing any data to avoid that a zone reset has to be issued while * writing data, which causes data loss. */ - zbd_reset_zones(td, f, zb, ze, td->o.verify != VERIFY_NONE && - td->runstate != TD_VERIFYING); + if (td->o.verify != VERIFY_NONE && td->runstate != TD_VERIFYING) + zbd_reset_zones(td, f, zb, ze); zbd_reset_write_cnt(td, f); }