X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=0d24b189fece6ee48d11e4f3bf493af271f2731e;hp=3f713671ea66f5017be80534f025af3f940d0531;hb=edf2c6cf5adc82ee43c81e033cf2215eb9ffdb16;hpb=dc873b6f4a536c332b72cce268d5a7ccd356a891 diff --git a/io_u.c b/io_u.c index 3f713671..0d24b189 100644 --- a/io_u.c +++ b/io_u.c @@ -77,7 +77,6 @@ static void mark_random_map(struct thread_data *td, struct io_u *io_u) else mask = ((1U << this_blocks) - 1) << bit; - fio_assert(td, !(f->file_map[idx] & mask)); f->file_map[idx] |= mask; nr_blocks -= this_blocks; blocks += this_blocks; @@ -228,20 +227,30 @@ static int get_next_offset(struct thread_data *td, struct io_u *io_u) return 0; } +static inline int is_power_of_2(unsigned int val) +{ + return (val != 0 && ((val & (val - 1)) == 0)); +} + static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u) { const int ddir = io_u->ddir; unsigned int buflen = buflen; /* silence dumb gcc warning */ + unsigned int minbs, maxbs; long r; - if (td->o.min_bs[ddir] == td->o.max_bs[ddir]) - buflen = td->o.min_bs[ddir]; + minbs = td->o.min_bs[ddir]; + maxbs = td->o.max_bs[ddir]; + + if (minbs == maxbs) + buflen = minbs; else { r = os_random_long(&td->bsrange_state); if (!td->o.bssplit_nr) { - buflen = (unsigned int) - (1 + (double) (td->o.max_bs[ddir] - 1) - * r / (OS_RAND_MAX + 1.0)); + buflen = 1 + (unsigned int) ((double) maxbs * + (r / (OS_RAND_MAX + 1.0))); + if (buflen < minbs) + buflen = minbs; } else { long perc = 0; unsigned int i; @@ -251,20 +260,18 @@ static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u) buflen = bsp->bs; perc += bsp->perc; - if (r <= ((LONG_MAX / 100L) * perc)) + if (r <= ((OS_RAND_MAX / 100L) * perc)) break; } } - if (!td->o.bs_unaligned) { - buflen = (buflen + td->o.min_bs[ddir] - 1) - & ~(td->o.min_bs[ddir] - 1); - } + if (!td->o.bs_unaligned && is_power_of_2(minbs)) + buflen = (buflen + minbs - 1) & ~(minbs - 1); } if (io_u->offset + buflen > io_u->file->real_file_size) { dprint(FD_IO, "lower buflen %u -> %u (ddir=%d)\n", buflen, - td->o.min_bs[ddir], ddir); - buflen = td->o.min_bs[ddir]; + minbs, ddir); + buflen = minbs; } return buflen; @@ -971,19 +978,19 @@ long io_u_sync_complete(struct thread_data *td, struct io_u *io_u) /* * Called to complete min_events number of io for the async engines. */ -long io_u_queued_complete(struct thread_data *td, int min_events) +long io_u_queued_complete(struct thread_data *td, int min_evts) { struct io_completion_data icd; struct timespec *tvp = NULL; int ret; struct timespec ts = { .tv_sec = 0, .tv_nsec = 0, }; - dprint(FD_IO, "io_u_queued_completed: min=%d\n", min_events); + dprint(FD_IO, "io_u_queued_completed: min=%d\n", min_evts); - if (!min_events) + if (!min_evts) tvp = &ts; - ret = td_io_getevents(td, min_events, td->cur_depth, tvp); + ret = td_io_getevents(td, min_evts, td->o.iodepth_batch_complete, tvp); if (ret < 0) { td_verror(td, -ret, "td_io_getevents"); return ret;