engines/io_uring: use fixed opcodes for pre-mapped buffers
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index d28d368f694916683ad05ad34f7fa446d3c11e89..03f5c21f37c10523362ed2c73af8f57fe1ca691e 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -557,10 +557,10 @@ static unsigned long long get_next_buflen(struct thread_data *td, struct io_u *i
                        for (i = 0; i < td->o.bssplit_nr[ddir]; i++) {
                                struct bssplit *bsp = &td->o.bssplit[ddir][i];
 
+                               if (!bsp->perc)
+                                       continue;
                                buflen = bsp->bs;
                                perc += bsp->perc;
-                               if (!perc)
-                                       break;
                                if ((r / perc <= frand_max / 100ULL) &&
                                    io_u_fits(td, io_u, buflen))
                                        break;
@@ -570,8 +570,10 @@ static unsigned long long get_next_buflen(struct thread_data *td, struct io_u *i
                power_2 = is_power_of_2(minbs);
                if (!td->o.bs_unaligned && power_2)
                        buflen &= ~(minbs - 1);
-               else if (!td->o.bs_unaligned && !power_2) 
-                       buflen -= buflen % minbs; 
+               else if (!td->o.bs_unaligned && !power_2)
+                       buflen -= buflen % minbs;
+               if (buflen > maxbs)
+                       buflen = maxbs;
        } while (!io_u_fits(td, io_u, buflen));
 
        return buflen;
@@ -642,7 +644,7 @@ static enum fio_ddir rate_ddir(struct thread_data *td, enum fio_ddir ddir)
        uint64_t now;
 
        assert(ddir_rw(ddir));
-       now = utime_since_now(&td->start);
+       now = utime_since_now(&td->epoch);
 
        /*
         * if rate_next_io_time is in the past, need to catch up to rate
@@ -773,10 +775,7 @@ void put_io_u(struct thread_data *td, struct io_u *io_u)
 {
        const bool needs_lock = td_async_processing(td);
 
-       if (io_u->post_submit) {
-               io_u->post_submit(io_u, io_u->error == 0);
-               io_u->post_submit = NULL;
-       }
+       zbd_put_io_u(io_u);
 
        if (td->parent)
                td = td->parent;
@@ -851,7 +850,7 @@ static void setup_strided_zone_mode(struct thread_data *td, struct io_u *io_u)
        /*
         * See if it's time to switch to a new zone
         */
-       if (td->zone_bytes >= td->o.zone_size && td->o.zone_skip) {
+       if (td->zone_bytes >= td->o.zone_size) {
                td->zone_bytes = 0;
                f->file_offset += td->o.zone_range + td->o.zone_skip;
 
@@ -902,6 +901,8 @@ static int fill_io_u(struct thread_data *td, struct io_u *io_u)
 
        if (td->o.zone_mode == ZONE_MODE_STRIDED)
                setup_strided_zone_mode(td, io_u);
+       else if (td->o.zone_mode == ZONE_MODE_ZBD)
+               setup_zbd_zone_mode(td, io_u);
 
        /*
         * No log, let the seq/rand engine retrieve the next buflen and
@@ -1338,10 +1339,7 @@ static long set_io_u_file(struct thread_data *td, struct io_u *io_u)
                if (!fill_io_u(td, io_u))
                        break;
 
-               if (io_u->post_submit) {
-                       io_u->post_submit(io_u, false);
-                       io_u->post_submit = NULL;
-               }
+               zbd_put_io_u(io_u);
 
                put_file_log(td, f);
                td_io_close_file(td, f);
@@ -1559,9 +1557,8 @@ again:
                assert(!(td->flags & TD_F_CHILD));
                ret = pthread_cond_wait(&td->free_cond, &td->io_u_lock);
                assert(ret == 0);
-               if (td->error)
-                       return NULL;
-               goto again;
+               if (!td->error)
+                       goto again;
        }
 
        if (needs_lock)
@@ -2185,7 +2182,7 @@ void io_u_fill_buffer(struct thread_data *td, struct io_u *io_u,
 static int do_sync_file_range(const struct thread_data *td,
                              struct fio_file *f)
 {
-       off64_t offset, nbytes;
+       uint64_t offset, nbytes;
 
        offset = f->first_write;
        nbytes = f->last_write - f->first_write;