X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=a963441a9d3e6baabf4e312146638d90cb46f708;hp=18e3c3f1c5b9d08d40e4b3b40876b8a36e6a8e4d;hb=273f8c912d981439049d9b21aa048aaeaa323c5d;hpb=b6a4c7d152075209ba84ca05c32154427cbcd275 diff --git a/io_u.c b/io_u.c index 18e3c3f1..a963441a 100644 --- a/io_u.c +++ b/io_u.c @@ -118,7 +118,7 @@ static int get_next_rand_offset(struct thread_data *td, struct fio_file *f, /* * calculate map offset and chec if it's free */ - rb = *b + (f->file_offset / td->o.min_bs[ddir]); + rb = *b; if (random_map_free(td, f, rb)) return 0; @@ -162,10 +162,11 @@ static int get_next_offset(struct thread_data *td, struct io_u *io_u) if (get_next_rand_offset(td, f, ddir, &b)) return 1; } else { - if (f->last_pos >= f->real_file_size) - return 1; - - b = f->last_pos / td->o.min_bs[ddir]; + if (f->last_pos >= f->real_file_size) { + if (!td_random(td) || get_next_rand_offset(td, f, ddir, &b)) + return 1; + } else + b = (f->last_pos - f->file_offset) / td->o.min_bs[ddir]; } io_u->offset = (b * td->o.min_bs[ddir]) + f->file_offset; @@ -185,7 +186,21 @@ static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u) buflen = td->o.min_bs[ddir]; else { r = os_random_long(&td->bsrange_state); - buflen = (unsigned int) (1 + (double) (td->o.max_bs[ddir] - 1) * r / (RAND_MAX + 1.0)); + if (!td->o.bssplit_nr) + buflen = (unsigned int) (1 + (double) (td->o.max_bs[ddir] - 1) * r / (RAND_MAX + 1.0)); + else { + long perc = 0; + unsigned int i; + + for (i = 0; i < td->o.bssplit_nr; i++) { + struct bssplit *bsp = &td->o.bssplit[i]; + + buflen = bsp->bs; + perc += bsp->perc; + if (r <= ((LONG_MAX / 100L) * perc)) + break; + } + } if (!td->o.bs_unaligned) buflen = (buflen + td->o.min_bs[ddir] - 1) & ~(td->o.min_bs[ddir] - 1); } @@ -312,6 +327,9 @@ void requeue_io_u(struct thread_data *td, struct io_u **io_u) static int fill_io_u(struct thread_data *td, struct io_u *io_u) { + if (td->io_ops->flags & FIO_NOIO) + goto out; + /* * see if it's time to sync */ @@ -759,6 +777,7 @@ static void io_completed(struct thread_data *td, struct io_u *io_u, io_u_mark_latency(td, usec); if (td_write(td) && idx == DDIR_WRITE && + td->o.do_verify && td->o.verify != VERIFY_NONE) log_io_piece(td, io_u);