X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=eed7d9d91c8d12d829321ba8ec01b69e2576a381;hp=c58dcf0493bb50347367f8a1d6886ded60ec7748;hb=6cc1a3d1ae6e574ac1773ec5dfa46caea4c3627d;hpb=a871240086ca6bdc52f79d7459ed283c5a359299 diff --git a/io_u.c b/io_u.c index c58dcf04..eed7d9d9 100644 --- a/io_u.c +++ b/io_u.c @@ -31,21 +31,24 @@ static bool random_map_free(struct fio_file *f, const uint64_t block) /* * Mark a given offset as used in the map. */ -static void mark_random_map(struct thread_data *td, struct io_u *io_u) +static uint64_t mark_random_map(struct thread_data *td, struct io_u *io_u, + uint64_t offset, uint64_t buflen) { unsigned long long min_bs = td->o.min_bs[io_u->ddir]; struct fio_file *f = io_u->file; unsigned long long nr_blocks; uint64_t block; - block = (io_u->offset - f->file_offset) / (uint64_t) min_bs; - nr_blocks = (io_u->buflen + min_bs - 1) / min_bs; + block = (offset - f->file_offset) / (uint64_t) min_bs; + nr_blocks = (buflen + min_bs - 1) / min_bs; if (!(io_u->flags & IO_U_F_BUSY_OK)) nr_blocks = axmap_set_nr(f->io_axmap, block, nr_blocks); - if ((nr_blocks * min_bs) < io_u->buflen) - io_u->buflen = nr_blocks * min_bs; + if ((nr_blocks * min_bs) < buflen) + buflen = nr_blocks * min_bs; + + return buflen; } static uint64_t last_block(struct thread_data *td, struct fio_file *f, @@ -64,7 +67,7 @@ static uint64_t last_block(struct thread_data *td, struct fio_file *f, if (max_size > f->real_file_size) max_size = f->real_file_size; - if (td->o.zone_range) + if (td->o.zone_mode == ZONE_MODE_STRIDED && td->o.zone_range) max_size = td->o.zone_range; if (td->o.min_bs[ddir] > td->o.ba[ddir]) @@ -761,6 +764,11 @@ 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) { + if (io_u->post_submit) { + io_u->post_submit(io_u, io_u->error == 0); + io_u->post_submit = NULL; + } + if (td->parent) td = td->parent; @@ -815,10 +823,14 @@ void requeue_io_u(struct thread_data *td, struct io_u **io_u) *io_u = NULL; } -static void __fill_io_u_zone(struct thread_data *td, struct io_u *io_u) +static void setup_strided_zone_mode(struct thread_data *td, struct io_u *io_u) { struct fio_file *f = io_u->file; + assert(td->o.zone_mode == ZONE_MODE_STRIDED); + assert(td->o.zone_size); + assert(td->o.zone_range); + /* * See if it's time to switch to a new zone */ @@ -869,11 +881,8 @@ static int fill_io_u(struct thread_data *td, struct io_u *io_u) if (!ddir_rw(io_u->ddir)) goto out; - /* - * When file is zoned zone_range is always positive - */ - if (td->o.zone_range) - __fill_io_u_zone(td, io_u); + if (td->o.zone_mode == ZONE_MODE_STRIDED) + setup_strided_zone_mode(td, io_u); /* * No log, let the seq/rand engine retrieve the next buflen and @@ -902,7 +911,8 @@ 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)) - mark_random_map(td, io_u); + io_u->buflen = mark_random_map(td, io_u, io_u->offset, + io_u->buflen); out: dprint_io_u(io_u, "fill"); @@ -1303,6 +1313,11 @@ 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; + } + put_file_log(td, f); td_io_close_file(td, f); io_u->file = NULL;