Lines Matching refs:io_u

36 static void mark_random_map(struct thread_data *td, struct io_u *io_u)  in mark_random_map()  argument
39 struct fio_file *f = io_u->file; in mark_random_map()
43 block = (io_u->offset - f->file_offset) / (uint64_t) min_bs; in mark_random_map()
44 nr_blocks = (io_u->buflen + min_bs - 1) / min_bs; in mark_random_map()
46 if (!(io_u->flags & IO_U_F_BUSY_OK)) in mark_random_map()
49 if ((nr_blocks * min_bs) < io_u->buflen) in mark_random_map()
50 io_u->buflen = nr_blocks * min_bs; in mark_random_map()
299 static int get_next_block(struct thread_data *td, struct io_u *io_u, in get_next_block() argument
303 struct fio_file *f = io_u->file; in get_next_block()
318 io_u->flags |= IO_U_F_BUSY_OK; in get_next_block()
328 io_u->flags |= IO_U_F_BUSY_OK; in get_next_block()
351 io_u->offset = offset; in get_next_block()
353 io_u->offset = b * td->o.ba[ddir]; in get_next_block()
368 static int __get_next_offset(struct thread_data *td, struct io_u *io_u, in __get_next_offset() argument
371 struct fio_file *f = io_u->file; in __get_next_offset()
372 enum fio_ddir ddir = io_u->ddir; in __get_next_offset()
382 if (get_next_block(td, io_u, ddir, rw_seq_hit, is_random)) in __get_next_offset()
385 if (io_u->offset >= f->io_size) { in __get_next_offset()
387 (unsigned long long) io_u->offset, in __get_next_offset()
392 io_u->offset += f->file_offset; in __get_next_offset()
393 if (io_u->offset >= f->real_file_size) { in __get_next_offset()
395 (unsigned long long) io_u->offset, in __get_next_offset()
403 static int get_next_offset(struct thread_data *td, struct io_u *io_u, in get_next_offset() argument
410 return ops->fill_io_u_off(td, io_u, is_random); in get_next_offset()
413 return __get_next_offset(td, io_u, is_random); in get_next_offset()
416 static inline int io_u_fits(struct thread_data *td, struct io_u *io_u, in io_u_fits() argument
419 struct fio_file *f = io_u->file; in io_u_fits()
421 return io_u->offset + buflen <= f->io_size + get_start_offset(td, f); in io_u_fits()
424 static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u, in __get_next_buflen() argument
427 int ddir = io_u->ddir; in __get_next_buflen()
446 if (!io_u_fits(td, io_u, minbs)) in __get_next_buflen()
467 io_u_fits(td, io_u, buflen)) in __get_next_buflen()
479 } while (!io_u_fits(td, io_u, buflen)); in __get_next_buflen()
484 static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u, in get_next_buflen() argument
491 return ops->fill_io_u_size(td, io_u, is_random); in get_next_buflen()
494 return __get_next_buflen(td, io_u, is_random); in get_next_buflen()
661 static void set_rw_ddir(struct thread_data *td, struct io_u *io_u) in set_rw_ddir() argument
663 io_u->ddir = io_u->acct_ddir = get_rw_ddir(td); in set_rw_ddir()
665 if (io_u->ddir == DDIR_WRITE && (td->io_ops->flags & FIO_BARRIER) && in set_rw_ddir()
669 io_u->flags |= IO_U_F_BARRIER; in set_rw_ddir()
680 void put_io_u(struct thread_data *td, struct io_u *io_u) in put_io_u() argument
684 if (io_u->file && !(io_u->flags & IO_U_F_NO_FILE_PUT)) in put_io_u()
685 put_file_log(td, io_u->file); in put_io_u()
687 io_u->file = NULL; in put_io_u()
688 io_u->flags |= IO_U_F_FREE; in put_io_u()
690 if (io_u->flags & IO_U_F_IN_CUR_DEPTH) in put_io_u()
692 io_u_qpush(&td->io_u_freelist, io_u); in put_io_u()
697 void clear_io_u(struct thread_data *td, struct io_u *io_u) in clear_io_u() argument
699 io_u->flags &= ~IO_U_F_FLIGHT; in clear_io_u()
700 put_io_u(td, io_u); in clear_io_u()
703 void requeue_io_u(struct thread_data *td, struct io_u **io_u) in requeue_io_u() argument
705 struct io_u *__io_u = *io_u; in requeue_io_u()
722 *io_u = NULL; in requeue_io_u()
725 static int fill_io_u(struct thread_data *td, struct io_u *io_u) in fill_io_u() argument
732 set_rw_ddir(td, io_u); in fill_io_u()
737 if (!ddir_rw(io_u->ddir)) in fill_io_u()
744 struct fio_file *f = io_u->file; in fill_io_u()
754 f->last_pos[io_u->ddir] = f->file_offset; in fill_io_u()
762 if (get_next_offset(td, io_u, &is_random)) { in fill_io_u()
763 dprint(FD_IO, "io_u %p, failed getting offset\n", io_u); in fill_io_u()
767 io_u->buflen = get_next_buflen(td, io_u, is_random); in fill_io_u()
768 if (!io_u->buflen) { in fill_io_u()
769 dprint(FD_IO, "io_u %p, failed getting buflen\n", io_u); in fill_io_u()
773 if (io_u->offset + io_u->buflen > io_u->file->real_file_size) { in fill_io_u()
774 dprint(FD_IO, "io_u %p, offset too large\n", io_u); in fill_io_u()
776 (unsigned long long) io_u->offset, io_u->buflen, in fill_io_u()
777 (unsigned long long) io_u->file->real_file_size); in fill_io_u()
784 if (td_random(td) && file_randommap(td, io_u->file)) in fill_io_u()
785 mark_random_map(td, io_u); in fill_io_u()
788 dprint_io_u(io_u, "fill_io_u"); in fill_io_u()
789 td->zone_bytes += io_u->buflen; in fill_io_u()
1108 static long set_io_u_file(struct thread_data *td, struct io_u *io_u) in set_io_u_file() argument
1117 io_u->file = f; in set_io_u_file()
1120 if (!fill_io_u(td, io_u)) in set_io_u_file()
1125 io_u->file = NULL; in set_io_u_file()
1291 struct io_u *__get_io_u(struct thread_data *td) in __get_io_u()
1293 struct io_u *io_u = NULL; in __get_io_u() local
1302 io_u = io_u_rpop(&td->io_u_requeues); in __get_io_u()
1304 io_u = io_u_qpop(&td->io_u_freelist); in __get_io_u()
1306 io_u->file = NULL; in __get_io_u()
1307 io_u->buflen = 0; in __get_io_u()
1308 io_u->resid = 0; in __get_io_u()
1309 io_u->end_io = NULL; in __get_io_u()
1312 if (io_u) { in __get_io_u()
1313 assert(io_u->flags & IO_U_F_FREE); in __get_io_u()
1314 io_u->flags &= ~(IO_U_F_FREE | IO_U_F_NO_FILE_PUT | in __get_io_u()
1318 io_u->error = 0; in __get_io_u()
1319 io_u->acct_ddir = -1; in __get_io_u()
1321 io_u->flags |= IO_U_F_IN_CUR_DEPTH; in __get_io_u()
1322 io_u->ipo = NULL; in __get_io_u()
1333 return io_u; in __get_io_u()
1336 static int check_get_trim(struct thread_data *td, struct io_u *io_u) in check_get_trim() argument
1355 if (get_trim && !get_next_trim(td, io_u)) in check_get_trim()
1362 static int check_get_verify(struct thread_data *td, struct io_u *io_u) in check_get_verify() argument
1380 if (get_verify && !get_next_verify(td, io_u)) { in check_get_verify()
1395 static void small_content_scramble(struct io_u *io_u) in small_content_scramble() argument
1397 unsigned int i, nr_blocks = io_u->buflen / 512; in small_content_scramble()
1405 p = io_u->xfer_buf; in small_content_scramble()
1406 boffset = io_u->offset; in small_content_scramble()
1407 io_u->buf_filled_len = 0; in small_content_scramble()
1415 offset = (io_u->start_time.tv_usec ^ boffset) & 511; in small_content_scramble()
1421 end = p + 512 - sizeof(io_u->start_time); in small_content_scramble()
1422 memcpy(end, &io_u->start_time, sizeof(io_u->start_time)); in small_content_scramble()
1432 struct io_u *get_io_u(struct thread_data *td) in get_io_u()
1435 struct io_u *io_u; in get_io_u() local
1439 io_u = __get_io_u(td); in get_io_u()
1440 if (!io_u) { in get_io_u()
1445 if (check_get_verify(td, io_u)) in get_io_u()
1447 if (check_get_trim(td, io_u)) in get_io_u()
1453 if (io_u->file) in get_io_u()
1460 if (read_iolog_get(td, io_u)) in get_io_u()
1462 } else if (set_io_u_file(td, io_u)) { in get_io_u()
1464 dprint(FD_IO, "io_u %p, setting file failed\n", io_u); in get_io_u()
1468 f = io_u->file; in get_io_u()
1470 dprint(FD_IO, "io_u %p, setting file failed\n", io_u); in get_io_u()
1476 if (ddir_rw(io_u->ddir)) { in get_io_u()
1477 if (!io_u->buflen && !(td->io_ops->flags & FIO_NOIO)) { in get_io_u()
1478 dprint(FD_IO, "get_io_u: zero buflen on %p\n", io_u); in get_io_u()
1482 f->last_start[io_u->ddir] = io_u->offset; in get_io_u()
1483 f->last_pos[io_u->ddir] = io_u->offset + io_u->buflen; in get_io_u()
1485 if (io_u->ddir == DDIR_WRITE) { in get_io_u()
1487 io_u_fill_buffer(td, io_u, in get_io_u()
1489 io_u->xfer_buflen); in get_io_u()
1494 populate_verify_io_u(td, io_u); in get_io_u()
1497 } else if (io_u->ddir == DDIR_READ) { in get_io_u()
1502 io_u->buf_filled_len = 0; in get_io_u()
1509 io_u->xfer_buf = io_u->buf; in get_io_u()
1510 io_u->xfer_buflen = io_u->buflen; in get_io_u()
1513 assert(io_u->file); in get_io_u()
1514 if (!td_io_prep(td, io_u)) { in get_io_u()
1516 fio_gettime(&io_u->start_time, NULL); in get_io_u()
1518 small_content_scramble(io_u); in get_io_u()
1519 return io_u; in get_io_u()
1523 put_io_u(td, io_u); in get_io_u()
1527 void io_u_log_error(struct thread_data *td, struct io_u *io_u) in io_u_log_error() argument
1529 enum error_type_bit eb = td_error_type(io_u->ddir, io_u->error); in io_u_log_error()
1531 if (td_non_fatal_error(td, eb, io_u->error) && !td->o.error_dump) in io_u_log_error()
1535 io_u->file ? " on file " : "", in io_u_log_error()
1536 io_u->file ? io_u->file->file_name : "", in io_u_log_error()
1537 strerror(io_u->error), in io_u_log_error()
1538 io_ddir_name(io_u->ddir), in io_u_log_error()
1539 io_u->offset, io_u->xfer_buflen); in io_u_log_error()
1542 td_verror(td, io_u->error, "io_u error"); in io_u_log_error()
1551 static void account_io_completion(struct thread_data *td, struct io_u *io_u, in account_io_completion() argument
1558 lusec = utime_since(&io_u->issue_time, &icd->time); in account_io_completion()
1563 tusec = utime_since(&io_u->start_time, &icd->time); in account_io_completion()
1564 add_lat_sample(td, idx, tusec, bytes, io_u->offset); in account_io_completion()
1582 add_clat_sample(td, idx, lusec, bytes, io_u->offset); in account_io_completion()
1604 static void io_completed(struct thread_data *td, struct io_u **io_u_ptr, in io_completed()
1607 struct io_u *io_u = *io_u_ptr; in io_completed() local
1608 enum fio_ddir ddir = io_u->ddir; in io_completed()
1609 struct fio_file *f = io_u->file; in io_completed()
1611 dprint_io_u(io_u, "io complete"); in io_completed()
1614 assert(io_u->flags & IO_U_F_FLIGHT); in io_completed()
1615 io_u->flags &= ~(IO_U_F_FLIGHT | IO_U_F_BUSY_OK); in io_completed()
1620 if (io_u->ipo) { in io_completed()
1624 if (io_u->error) in io_completed()
1625 unlog_io_piece(td, io_u); in io_completed()
1627 io_u->ipo->flags &= ~IP_F_IN_FLIGHT; in io_completed()
1646 if (!io_u->error && ddir_rw(ddir)) { in io_completed()
1647 unsigned int bytes = io_u->buflen - io_u->resid; in io_completed()
1655 if (!(io_u->flags & IO_U_F_VER_LIST)) in io_completed()
1661 io_u->offset < f->first_write) in io_completed()
1662 f->first_write = io_u->offset; in io_completed()
1664 ((io_u->offset + bytes) > f->last_write)) in io_completed()
1665 f->last_write = io_u->offset + bytes; in io_completed()
1670 td->last_write_comp[idx] = io_u->offset; in io_completed()
1678 account_io_completion(td, io_u, icd, ddir, bytes); in io_completed()
1695 if (io_u->end_io) { in io_completed()
1696 ret = io_u->end_io(td, io_u_ptr); in io_completed()
1697 io_u = *io_u_ptr; in io_completed()
1701 } else if (io_u->error) { in io_completed()
1702 icd->error = io_u->error; in io_completed()
1703 io_u_log_error(td, io_u); in io_completed()
1718 if (io_u) in io_completed()
1719 io_u->error = 0; in io_completed()
1741 struct io_u *io_u; in ios_completed() local
1745 io_u = td->io_ops->event(td, i); in ios_completed()
1747 io_completed(td, &io_u, icd); in ios_completed()
1749 if (io_u) in ios_completed()
1750 put_io_u(td, io_u); in ios_completed()
1757 int io_u_sync_complete(struct thread_data *td, struct io_u *io_u, in io_u_sync_complete() argument
1763 io_completed(td, &io_u, &icd); in io_u_sync_complete()
1765 if (io_u) in io_u_sync_complete()
1766 put_io_u(td, io_u); in io_u_sync_complete()
1828 void io_u_queued(struct thread_data *td, struct io_u *io_u) in io_u_queued() argument
1833 slat_time = utime_since(&io_u->start_time, &io_u->issue_time); in io_u_queued()
1834 add_slat_sample(td, io_u->ddir, slat_time, io_u->xfer_buflen, in io_u_queued()
1835 io_u->offset); in io_u_queued()
1908 void io_u_fill_buffer(struct thread_data *td, struct io_u *io_u, in io_u_fill_buffer() argument
1911 io_u->buf_filled_len = 0; in io_u_fill_buffer()
1912 fill_io_buffer(td, io_u->buf, min_write, max_bs); in io_u_fill_buffer()