X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=io_u.c;h=d03049e52332e2b01510364863af812ecfd8e496;hb=45f944b907acf5c8aeb6bca72c8932ea3ead258e;hp=1013c7fd0aeaa515b41cd2465272f0ecda4514ae;hpb=6a5c4d92ce70a05d2fee981b6f133373c0ef62f8;p=fio.git diff --git a/io_u.c b/io_u.c index 1013c7fd..d03049e5 100644 --- a/io_u.c +++ b/io_u.c @@ -101,7 +101,7 @@ static int __get_next_rand_offset(struct thread_data *td, struct fio_file *f, r = __rand(&td->__random_state); } - dprint(FD_RANDOM, "off rand %llu\n", r); + dprint(FD_RANDOM, "off rand %llu\n", (unsigned long long) r); *b = (lastb - 1) * (r / ((uint64_t) rmax + 1.0)); } else { @@ -125,7 +125,8 @@ static int __get_next_rand_offset(struct thread_data *td, struct fio_file *f, if (random_map_free(f, *b)) goto ret; - dprint(FD_RANDOM, "get_next_rand_offset: offset %llu busy\n", *b); + dprint(FD_RANDOM, "get_next_rand_offset: offset %llu busy\n", + (unsigned long long) *b); *b = axmap_next_free(f->io_axmap, *b); if (*b == (uint64_t) -1ULL) @@ -190,6 +191,25 @@ static inline int should_sort_io(struct thread_data *td) return 1; } +static int should_do_random(struct thread_data *td) +{ + unsigned int v; + unsigned long r; + + if (td->o.perc_rand == 100) + return 1; + + if (td->o.use_os_rand) { + r = os_random_long(&td->seq_rand_state); + v = 1 + (int) (100.0 * (r / (OS_RAND_MAX + 1.0))); + } else { + r = __rand(&td->__seq_rand_state); + v = 1 + (int) (100.0 * (r / (FRAND_MAX + 1.0))); + } + + return v <= td->o.perc_rand; +} + static int get_next_rand_offset(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir, uint64_t *b) { @@ -242,7 +262,8 @@ static int get_next_rand_block(struct thread_data *td, struct fio_file *f, } dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n", - f->file_name, f->last_pos, f->real_file_size); + f->file_name, (unsigned long long) f->last_pos, + (unsigned long long) f->real_file_size); return 1; } @@ -283,9 +304,16 @@ static int get_next_block(struct thread_data *td, struct io_u *io_u, b = offset = -1ULL; if (rw_seq) { - if (td_random(td)) - ret = get_next_rand_block(td, f, ddir, &b); - else + if (td_random(td)) { + if (should_do_random(td)) + ret = get_next_rand_block(td, f, ddir, &b); + else { + io_u->flags |= IO_U_F_BUSY_OK; + ret = get_next_seq_offset(td, f, ddir, &offset); + if (ret) + ret = get_next_rand_block(td, f, ddir, &b); + } + } else ret = get_next_seq_offset(td, f, ddir, &offset); } else { io_u->flags |= IO_U_F_BUSY_OK; @@ -312,8 +340,7 @@ static int get_next_block(struct thread_data *td, struct io_u *io_u, else if (b != -1ULL) io_u->offset = b * td->o.ba[ddir]; else { - log_err("fio: bug in offset generation: offset=%llu, b=%llu\n", - offset, b); + log_err("fio: bug in offset generation: offset=%llu, b=%llu\n", (unsigned long long) offset, (unsigned long long) b); ret = 1; } } @@ -344,14 +371,16 @@ static int __get_next_offset(struct thread_data *td, struct io_u *io_u) if (io_u->offset >= f->io_size) { dprint(FD_IO, "get_next_offset: offset %llu >= io_size %llu\n", - io_u->offset, f->io_size); + (unsigned long long) io_u->offset, + (unsigned long long) f->io_size); return 1; } io_u->offset += f->file_offset; if (io_u->offset >= f->real_file_size) { dprint(FD_IO, "get_next_offset: offset %llu >= size %llu\n", - io_u->offset, f->real_file_size); + (unsigned long long) io_u->offset, + (unsigned long long) f->real_file_size); return 1; } @@ -527,10 +556,10 @@ static enum fio_ddir rate_ddir(struct thread_data *td, enum fio_ddir ddir) * io's that have been actually submitted to an async engine, * and cur_depth is meaningless for sync engines. */ - if (td->io_u_in_flight) { + while (td->io_u_in_flight) { int fio_unused ret; - ret = io_u_queued_complete(td, td->io_u_in_flight, NULL); + ret = io_u_queued_complete(td, 1, NULL); } fio_gettime(&t, NULL); @@ -716,8 +745,9 @@ static int fill_io_u(struct thread_data *td, struct io_u *io_u) if (io_u->offset + io_u->buflen > io_u->file->real_file_size) { dprint(FD_IO, "io_u %p, offset too large\n", io_u); - dprint(FD_IO, " off=%llu/%lu > %llu\n", io_u->offset, - io_u->buflen, io_u->file->real_file_size); + dprint(FD_IO, " off=%llu/%lu > %llu\n", + (unsigned long long) io_u->offset, io_u->buflen, + (unsigned long long) io_u->file->real_file_size); return 1; }