log_io_piece(td, io_u);
if (td->o.io_submit_mode == IO_MODE_OFFLOAD) {
+ const unsigned long blen = io_u->xfer_buflen;
+ const enum fio_ddir ddir = acct_ddir(io_u);
+
if (td->error)
break;
- ret = workqueue_enqueue(&td->io_wq, io_u);
+
+ ret = workqueue_enqueue(&td->io_wq, &io_u->work);
+ if (ret)
+ ret = FIO_Q_QUEUED;
+ else
+ ret = FIO_Q_BUSY;
+
+ if (ret == FIO_Q_QUEUED && ddir_rw(ddir)) {
+ td->io_issues[ddir]++;
+ td->io_issue_bytes[ddir] += blen;
+ td->rate_io_issue_bytes[ddir] += blen;
+ }
if (should_check_rate(td))
td->rate_next_io_time[ddir] = usec_for_io(td, ddir);
return td->bytes_done[DDIR_WRITE] + td->bytes_done[DDIR_TRIM];
}
-static void io_workqueue_fn(struct thread_data *td, struct io_u *io_u)
+static void io_workqueue_fn(struct thread_data *td, struct workqueue_work *work)
{
+ struct io_u *io_u = container_of(work, struct io_u, work);
const enum fio_ddir ddir = io_u->ddir;
int ret;