X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;ds=sidebyside;f=io_u.c;h=834e5d214d5da390365858f36d67ed3fd67127a6;hb=7e326f3bbc7e6f23f2b4c99282f73a7948d02637;hp=318614cdb39b5213fc8d833a9f028b560f27eb84;hpb=f697125ab9003d358a37186d610e09799afd190f;p=fio.git diff --git a/io_u.c b/io_u.c index 318614cd..834e5d21 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,13 +147,13 @@ 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; unsigned long elapsed; - gettimeofday(&now, NULL); + fio_gettime(&now, NULL); elapsed = mtime_since_now(&td->rwmix_switch); /* @@ -267,13 +267,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,14 +296,13 @@ struct io_u *get_io_u(struct thread_data *td, struct fio_file *f) return NULL; } - gettimeofday(&io_u->start_time, NULL); + fio_gettime(&io_u->start_time, NULL); return io_u; } void io_completed(struct thread_data *td, struct io_u *io_u, struct io_completion_data *icd) { - struct timeval e; unsigned long msec; if (io_u->ddir == DDIR_SYNC) { @@ -313,21 +312,21 @@ void io_completed(struct thread_data *td, struct io_u *io_u, td->last_was_sync = 0; - gettimeofday(&e, NULL); - 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; td->zone_bytes += bytes; td->this_io_bytes[idx] += bytes; - msec = mtime_since(&io_u->issue_time, &e); + io_u->file->last_completed_pos = io_u->offset + io_u->buflen; + + msec = mtime_since(&io_u->issue_time, &icd->time); add_clat_sample(td, idx, msec); - add_bw_sample(td, idx); + add_bw_sample(td, idx, &icd->time); if ((td_rw(td) || td_write(td)) && idx == DDIR_WRITE) log_io_piece(td, io_u); @@ -342,6 +341,8 @@ void ios_completed(struct thread_data *td, struct io_completion_data *icd) struct io_u *io_u; int i; + fio_gettime(&icd->time, NULL); + icd->error = 0; icd->bytes_done[0] = icd->bytes_done[1] = 0;