t/io_uring: print file depths
[fio.git] / zbd.c
diff --git a/zbd.c b/zbd.c
index aa08b81115342342d383e3705aa2c25a17b9f277..8acda1f62f32bcf38c458f3eb67110e54262da7c 100644 (file)
--- a/zbd.c
+++ b/zbd.c
@@ -726,29 +726,76 @@ static bool zbd_dec_and_reset_write_cnt(const struct thread_data *td,
        return write_cnt == 0;
 }
 
-void zbd_file_reset(struct thread_data *td, struct fio_file *f)
+enum swd_action {
+       CHECK_SWD,
+       SET_SWD,
+};
+
+/* Calculate the number of sectors with data (swd) and perform action 'a' */
+static uint64_t zbd_process_swd(const struct fio_file *f, enum swd_action a)
 {
        struct fio_zone_info *zb, *ze, *z;
-       uint32_t zone_idx_e;
        uint64_t swd = 0;
 
-       if (!f->zbd_info)
-               return;
-
        zb = &f->zbd_info->zone_info[zbd_zone_idx(f, f->file_offset)];
-       zone_idx_e = zbd_zone_idx(f, f->file_offset + f->io_size);
-       ze = &f->zbd_info->zone_info[zone_idx_e];
-       for (z = zb ; z < ze; z++) {
+       ze = &f->zbd_info->zone_info[zbd_zone_idx(f, f->file_offset +
+                                                 f->io_size)];
+       for (z = zb; z < ze; z++) {
                pthread_mutex_lock(&z->mutex);
                swd += z->wp - z->start;
        }
        pthread_mutex_lock(&f->zbd_info->mutex);
-       f->zbd_info->sectors_with_data = swd;
+       switch (a) {
+       case CHECK_SWD:
+               assert(f->zbd_info->sectors_with_data == swd);
+               break;
+       case SET_SWD:
+               f->zbd_info->sectors_with_data = swd;
+               break;
+       }
        pthread_mutex_unlock(&f->zbd_info->mutex);
-       for (z = zb ; z < ze; z++)
+       for (z = zb; z < ze; z++)
                pthread_mutex_unlock(&z->mutex);
-       dprint(FD_ZBD, "%s(%s): swd = %llu\n", __func__, f->file_name,
-               (unsigned long long) swd);
+
+       return swd;
+}
+
+/*
+ * The swd check is useful for debugging but takes too much time to leave
+ * it enabled all the time. Hence it is disabled by default.
+ */
+static const bool enable_check_swd = false;
+
+/* Check whether the value of zbd_info.sectors_with_data is correct. */
+static void zbd_check_swd(const struct fio_file *f)
+{
+       if (!enable_check_swd)
+               return;
+
+       zbd_process_swd(f, CHECK_SWD);
+}
+
+static void zbd_init_swd(struct fio_file *f)
+{
+       uint64_t swd;
+
+       swd = zbd_process_swd(f, SET_SWD);
+       dprint(FD_ZBD, "%s(%s): swd = %" PRIu64 "\n", __func__, f->file_name,
+              swd);
+}
+
+void zbd_file_reset(struct thread_data *td, struct fio_file *f)
+{
+       struct fio_zone_info *zb, *ze;
+       uint32_t zone_idx_e;
+
+       if (!f->zbd_info)
+               return;
+
+       zb = &f->zbd_info->zone_info[zbd_zone_idx(f, f->file_offset)];
+       zone_idx_e = zbd_zone_idx(f, f->file_offset + f->io_size);
+       ze = &f->zbd_info->zone_info[zone_idx_e];
+       zbd_init_swd(f);
        /*
         * If data verification is enabled reset the affected zones before
         * writing any data to avoid that a zone reset has to be issued while
@@ -1077,6 +1124,8 @@ static void zbd_post_submit(const struct io_u *io_u, bool success)
        }
 unlock:
        pthread_mutex_unlock(&z->mutex);
+
+       zbd_check_swd(io_u->file);
 }
 
 bool zbd_unaligned_write(int error_code)
@@ -1129,6 +1178,8 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u)
            io_u->ddir == DDIR_READ && td->o.read_beyond_wp)
                return io_u_accept;
 
+       zbd_check_swd(f);
+
        pthread_mutex_lock(&zb->mutex);
        switch (io_u->ddir) {
        case DDIR_READ: