projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Random IO fixes
[fio.git]
/
io_u.c
diff --git
a/io_u.c
b/io_u.c
index 18e3c3f1c5b9d08d40e4b3b40876b8a36e6a8e4d..a963441a9d3e6baabf4e312146638d90cb46f708 100644
(file)
--- 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
*/
/*
* 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;
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 (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;
}
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 = 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);
}
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)
{
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
*/
/*
* 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 &&
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);
td->o.verify != VERIFY_NONE)
log_io_piece(td, io_u);