X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=a3540d14714ef45f59f7fcf22744bae507f6b491;hp=9b5f203c4733c2eabc122d2a3d32e56fd298c9ce;hb=fb1a0dcdc0869f0c92c49f13e640c15f4ab3b7e2;hpb=bd6b959a034cdcfcef010e56b139c609f56b83cf diff --git a/io_u.c b/io_u.c index 9b5f203c..a3540d14 100644 --- a/io_u.c +++ b/io_u.c @@ -10,6 +10,7 @@ #include "err.h" #include "lib/pow2.h" #include "minmax.h" +#include "zbd.h" struct io_completion_data { int nr; /* input */ @@ -767,6 +768,8 @@ void put_file_log(struct thread_data *td, struct fio_file *f) 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; @@ -775,7 +778,8 @@ void put_io_u(struct thread_data *td, struct io_u *io_u) if (td->parent) td = td->parent; - td_io_u_lock(td); + if (needs_lock) + __td_io_u_lock(td); if (io_u->file && !(io_u->flags & IO_U_F_NO_FILE_PUT)) put_file_log(td, io_u->file); @@ -789,7 +793,9 @@ void put_io_u(struct thread_data *td, struct io_u *io_u) } io_u_qpush(&td->io_u_freelist, io_u); td_io_u_free_notify(td); - td_io_u_unlock(td); + + if (needs_lock) + __td_io_u_unlock(td); } void clear_io_u(struct thread_data *td, struct io_u *io_u) @@ -800,6 +806,7 @@ void clear_io_u(struct thread_data *td, struct io_u *io_u) void requeue_io_u(struct thread_data *td, struct io_u **io_u) { + const bool needs_lock = td_async_processing(td); struct io_u *__io_u = *io_u; enum fio_ddir ddir = acct_ddir(__io_u); @@ -808,7 +815,8 @@ void requeue_io_u(struct thread_data *td, struct io_u **io_u) if (td->parent) td = td->parent; - td_io_u_lock(td); + if (needs_lock) + __td_io_u_lock(td); io_u_set(td, __io_u, IO_U_F_FREE); if ((__io_u->flags & IO_U_F_FLIGHT) && ddir_rw(ddir)) @@ -822,7 +830,10 @@ void requeue_io_u(struct thread_data *td, struct io_u **io_u) io_u_rpush(&td->io_u_requeues, __io_u); td_io_u_free_notify(td); - td_io_u_unlock(td); + + if (needs_lock) + __td_io_u_unlock(td); + *io_u = NULL; } @@ -872,6 +883,8 @@ static void setup_strided_zone_mode(struct thread_data *td, struct io_u *io_u) static int fill_io_u(struct thread_data *td, struct io_u *io_u) { bool is_random; + uint64_t offset; + enum io_u_action ret; if (td_ioengine_flagged(td, FIO_NOIO)) goto out; @@ -902,6 +915,13 @@ static int fill_io_u(struct thread_data *td, struct io_u *io_u) return 1; } + offset = io_u->offset; + if (td->o.zone_mode == ZONE_MODE_ZBD) { + ret = zbd_adjust_block(td, io_u); + if (ret == io_u_eof) + return 1; + } + if (io_u->offset + io_u->buflen > io_u->file->real_file_size) { dprint(FD_IO, "io_u %p, off=0x%llx + len=0x%llx exceeds file size=0x%llx\n", io_u, @@ -914,8 +934,7 @@ static int fill_io_u(struct thread_data *td, struct io_u *io_u) * mark entry before potentially trimming io_u */ if (td_random(td) && file_randommap(td, io_u->file)) - io_u->buflen = mark_random_map(td, io_u, io_u->offset, - io_u->buflen); + io_u->buflen = mark_random_map(td, io_u, offset, io_u->buflen); out: dprint_io_u(io_u, "fill"); @@ -1495,13 +1514,15 @@ bool queue_full(const struct thread_data *td) struct io_u *__get_io_u(struct thread_data *td) { + const bool needs_lock = td_async_processing(td); struct io_u *io_u = NULL; int ret; if (td->stop_io) return NULL; - td_io_u_lock(td); + if (needs_lock) + __td_io_u_lock(td); again: if (!io_u_rempty(&td->io_u_requeues)) @@ -1538,7 +1559,9 @@ again: goto again; } - td_io_u_unlock(td); + if (needs_lock) + __td_io_u_unlock(td); + return io_u; }