zbd: refer file->last_start[] instead of sectors with data accounting
authorShin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Thu, 9 Feb 2023 07:09:00 +0000 (16:09 +0900)
committerVincent Fu <vincent.fu@samsung.com>
Tue, 14 Feb 2023 14:52:52 +0000 (09:52 -0500)
To decide the first IO direction of randrw workload, the function
zbd_adjust_ddir() refers to the zbd_info->sectors_with_data value which
indicates the number of bytes written to the zoned block devices being
accessed. However, this accounting has two issues. The first issue is
wrong accounting for multiple jobs with different write ranges. The
second issue is job start up failure due to zone lock contention.

Avoid using zbd_info->sectors_with_data and simply refer to file->
last_start[DDIR_WRITE] instead. It is initialized with -1ULL for each
job. After any write operation is done by the job, it keeps valid
offset. If it has valid offset, written data is expected and the first
IO direction can be read.

Also remove zbd_info->sectors_with_data, which is no longer used. Keep
the field zbd_info->wp_sectors_with_data since it is still used for
zones with write pointers.

Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Reviewed-by: Niklas Cassel <niklas.cassel@wdc.com>
Signed-off-by: Vincent Fu <vincent.fu@samsung.com>
zbd.c
zbd.h

diff --git a/zbd.c b/zbd.c
index d1e469f665052987fd5ad55b77ba9161f7a2c7a3..f5e76c405697b0642802ec2f2c524bfbf883fca0 100644 (file)
--- a/zbd.c
+++ b/zbd.c
@@ -286,7 +286,6 @@ static int zbd_reset_zone(struct thread_data *td, struct fio_file *f,
        }
 
        pthread_mutex_lock(&f->zbd_info->mutex);
-       f->zbd_info->sectors_with_data -= data_in_zone;
        f->zbd_info->wp_sectors_with_data -= data_in_zone;
        pthread_mutex_unlock(&f->zbd_info->mutex);
 
@@ -1201,7 +1200,6 @@ static uint64_t zbd_process_swd(struct thread_data *td,
                                const struct fio_file *f, enum swd_action a)
 {
        struct fio_zone_info *zb, *ze, *z;
-       uint64_t swd = 0;
        uint64_t wp_swd = 0;
 
        zb = zbd_get_zone(f, f->min_zone);
@@ -1211,17 +1209,14 @@ static uint64_t zbd_process_swd(struct thread_data *td,
                        zone_lock(td, f, z);
                        wp_swd += z->wp - z->start;
                }
-               swd += z->wp - z->start;
        }
 
        pthread_mutex_lock(&f->zbd_info->mutex);
        switch (a) {
        case CHECK_SWD:
-               assert(f->zbd_info->sectors_with_data == swd);
                assert(f->zbd_info->wp_sectors_with_data == wp_swd);
                break;
        case SET_SWD:
-               f->zbd_info->sectors_with_data = swd;
                f->zbd_info->wp_sectors_with_data = wp_swd;
                break;
        }
@@ -1231,7 +1226,7 @@ static uint64_t zbd_process_swd(struct thread_data *td,
                if (z->has_wp)
                        zone_unlock(z);
 
-       return swd;
+       return wp_swd;
 }
 
 /*
@@ -1640,10 +1635,8 @@ static void zbd_queue_io(struct thread_data *td, struct io_u *io_u, int q,
                 * have occurred.
                 */
                pthread_mutex_lock(&zbd_info->mutex);
-               if (z->wp <= zone_end) {
-                       zbd_info->sectors_with_data += zone_end - z->wp;
+               if (z->wp <= zone_end)
                        zbd_info->wp_sectors_with_data += zone_end - z->wp;
-               }
                pthread_mutex_unlock(&zbd_info->mutex);
                z->wp = zone_end;
                break;
@@ -1801,8 +1794,7 @@ enum fio_ddir zbd_adjust_ddir(struct thread_data *td, struct io_u *io_u,
        if (ddir != DDIR_READ || !td_rw(td))
                return ddir;
 
-       if (io_u->file->zbd_info->sectors_with_data ||
-           td->o.read_beyond_wp)
+       if (io_u->file->last_start[DDIR_WRITE] != -1ULL || td->o.read_beyond_wp)
                return DDIR_READ;
 
        return DDIR_WRITE;
diff --git a/zbd.h b/zbd.h
index d425707e8216faa5041088ce23eb892ce4110282..9ab25c47e98bfd984b9021cfa75cba7c9538726b 100644 (file)
--- a/zbd.h
+++ b/zbd.h
@@ -54,7 +54,6 @@ struct fio_zone_info {
  * @mutex: Protects the modifiable members in this structure (refcount and
  *             num_open_zones).
  * @zone_size: size of a single zone in bytes.
- * @sectors_with_data: total size of data in all zones in units of 512 bytes
  * @wp_sectors_with_data: total size of data in zones with write pointers in
  *                        units of 512 bytes
  * @zone_size_log2: log2 of the zone size in bytes if it is a power of 2 or 0
@@ -76,7 +75,6 @@ struct zoned_block_device_info {
        uint32_t                max_open_zones;
        pthread_mutex_t         mutex;
        uint64_t                zone_size;
-       uint64_t                sectors_with_data;
        uint64_t                wp_sectors_with_data;
        uint32_t                zone_size_log2;
        uint32_t                nr_zones;