projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add support for queuing > 1 command at the time
[fio.git]
/
fio.c
diff --git
a/fio.c
b/fio.c
index 6e78949b52fd7771b94d31bc0b14c0575e18c84c..858d6b81e6c5df199e17ae33f09d802105b1011b 100644
(file)
--- a/
fio.c
+++ b/
fio.c
@@
-209,6
+209,7
@@
static int fio_io_sync(struct thread_data *td, struct fio_file *f)
return 1;
}
return 1;
}
+requeue:
ret = td_io_queue(td, io_u);
if (ret < 0) {
td_verror(td, io_u->error);
ret = td_io_queue(td, io_u);
if (ret < 0) {
td_verror(td, io_u->error);
@@
-224,6
+225,10
@@
static int fio_io_sync(struct thread_data *td, struct fio_file *f)
}
io_u_sync_complete(td, io_u, NULL);
}
io_u_sync_complete(td, io_u, NULL);
+ } else if (ret == FIO_Q_BUSY) {
+ if (td_io_commit(td))
+ return 1;
+ goto requeue;
}
return 0;
}
return 0;
@@
-285,6
+290,10
@@
requeue:
continue;
case FIO_Q_QUEUED:
break;
continue;
case FIO_Q_QUEUED:
break;
+ case FIO_Q_BUSY:
+ requeue_io_u(td, &io_u);
+ ret = td_io_commit(td);
+ break;
default:
assert(ret < 0);
td_verror(td, -ret);
default:
assert(ret < 0);
td_verror(td, -ret);
@@
-299,7
+308,7
@@
requeue:
* completed io_u's first.
*/
min_events = 0;
* completed io_u's first.
*/
min_events = 0;
- if (queue_full(td))
+ if (queue_full(td)
|| ret == FIO_Q_BUSY
)
min_events = 1;
/*
min_events = 1;
/*
@@
-403,6
+412,10
@@
requeue:
break;
case FIO_Q_QUEUED:
break;
break;
case FIO_Q_QUEUED:
break;
+ case FIO_Q_BUSY:
+ requeue_io_u(td, &io_u);
+ ret = td_io_commit(td);
+ break;
default:
assert(ret < 0);
put_io_u(td, io_u);
default:
assert(ret < 0);
put_io_u(td, io_u);
@@
-412,14
+425,15
@@
requeue:
if (ret < 0 || td->error)
break;
if (ret < 0 || td->error)
break;
- add_slat_sample(td, io_u->ddir, mtime_since(&io_u->start_time, &io_u->issue_time));
+ if (io_u)
+ add_slat_sample(td, io_u->ddir, mtime_since(&io_u->start_time, &io_u->issue_time));
/*
* See if we need to complete some commands
*/
/*
* See if we need to complete some commands
*/
- if (ret == FIO_Q_QUEUED) {
+ if (ret == FIO_Q_QUEUED
|| ret == FIO_Q_BUSY
) {
min_evts = 0;
min_evts = 0;
- if (queue_full(td))
+ if (queue_full(td)
|| ret == FIO_Q_BUSY
)
min_evts = 1;
fio_gettime(&comp_time, NULL);
min_evts = 1;
fio_gettime(&comp_time, NULL);
@@
-633,6
+647,7
@@
static void *thread_main(void *data)
INIT_LIST_HEAD(&td->io_u_freelist);
INIT_LIST_HEAD(&td->io_u_busylist);
INIT_LIST_HEAD(&td->io_u_freelist);
INIT_LIST_HEAD(&td->io_u_busylist);
+ INIT_LIST_HEAD(&td->io_u_requeues);
INIT_LIST_HEAD(&td->io_hist_list);
INIT_LIST_HEAD(&td->io_log_list);
INIT_LIST_HEAD(&td->io_hist_list);
INIT_LIST_HEAD(&td->io_log_list);