X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=da6fe8f3af0a55f2f0a26680f257b78f6996d0de;hp=8ec9dd9ecbfdd9b721b7a0b905fdbee9b89c5a84;hb=cec6b55da1c282b5b91ad346c7804171fccf151e;hpb=02bcaa8c31feb93c61b701d143a7eea3efd2124d diff --git a/io_u.c b/io_u.c index 8ec9dd9e..da6fe8f3 100644 --- a/io_u.c +++ b/io_u.c @@ -63,7 +63,7 @@ static int get_next_free_block(struct thread_data *td, struct fio_file *f, *b = 0; i = 0; - while ((*b) * td->rw_min_bs < f->file_size) { + while ((*b) * td->rw_min_bs < f->real_file_size) { if (f->file_map[i] != -1UL) { *b += ffz(f->file_map[i]); return 0; @@ -108,7 +108,7 @@ static int get_next_offset(struct thread_data *td, struct fio_file *f, b = f->last_pos / td->min_bs[ddir]; *offset = (b * td->min_bs[ddir]) + f->file_offset; - if (*offset > f->file_size) + if (*offset > f->real_file_size) return 1; return 0; @@ -123,7 +123,7 @@ static unsigned int get_next_buflen(struct thread_data *td, int ddir) buflen = td->min_bs[ddir]; else { r = os_random_long(&td->bsrange_state); - buflen = (1 + (double) (td->max_bs[ddir] - 1) * r / (RAND_MAX + 1.0)); + buflen = (unsigned int) (1 + (double) (td->max_bs[ddir] - 1) * r / (RAND_MAX + 1.0)); if (!td->bs_unaligned) buflen = (buflen + td->min_bs[ddir] - 1) & ~(td->min_bs[ddir] - 1); } @@ -147,7 +147,7 @@ static unsigned int get_next_buflen(struct thread_data *td, int ddir) * mixed read/write workload, check the rwmix cycle and switch if * necessary. */ -static int get_rw_ddir(struct thread_data *td) +static enum fio_ddir get_rw_ddir(struct thread_data *td) { if (td_rw(td)) { struct timeval now; @@ -227,6 +227,31 @@ static int fill_io_u(struct thread_data *td, struct fio_file *f, return 1; } +static void io_u_mark_depth(struct thread_data *td) +{ + int index = 0; + + switch (td->cur_depth) { + default: + index++; + case 32 ... 63: + index++; + case 16 ... 31: + index++; + case 8 ... 15: + index++; + case 4 ... 7: + index++; + case 2 ... 3: + index++; + case 1: + break; + } + + td->io_u_map[index]++; + td->total_io_u++; +} + struct io_u *__get_io_u(struct thread_data *td) { struct io_u *io_u = NULL; @@ -240,6 +265,7 @@ struct io_u *__get_io_u(struct thread_data *td) list_del(&io_u->list); list_add(&io_u->list, &td->io_u_busylist); td->cur_depth++; + io_u_mark_depth(td); } return io_u; @@ -267,13 +293,13 @@ struct io_u *get_io_u(struct thread_data *td, struct fio_file *f) return NULL; } - if (io_u->buflen + io_u->offset > f->file_size) { + if (io_u->buflen + io_u->offset > f->real_file_size) { if (td->io_ops->flags & FIO_RAWIO) { put_io_u(td, io_u); return NULL; } - io_u->buflen = f->file_size - io_u->offset; + io_u->buflen = f->real_file_size - io_u->offset; } if (io_u->ddir != DDIR_SYNC) { @@ -296,6 +322,8 @@ struct io_u *get_io_u(struct thread_data *td, struct fio_file *f) return NULL; } + io_u->xfer_buf = io_u->buf; + io_u->xfer_buflen = io_u->buflen; fio_gettime(&io_u->start_time, NULL); return io_u; } @@ -314,7 +342,7 @@ void io_completed(struct thread_data *td, struct io_u *io_u, if (!io_u->error) { unsigned int bytes = io_u->buflen - io_u->resid; - const int idx = io_u->ddir; + const enum fio_ddir idx = io_u->ddir; td->io_blocks[idx]++; td->io_bytes[idx] += bytes;