memset(io_u, 0, sizeof(*io_u));
INIT_LIST_HEAD(&io_u->list);
- io_u->buf = p + max_bs * i;
+ if (!(td->io_ops->flags & FIO_NOIO)) {
+ io_u->buf = p + max_bs * i;
- if (td_write(td))
- fill_io_buf(td, io_u, max_bs);
+ if (td_write(td))
+ fill_io_buf(td, io_u, max_bs);
+ }
io_u->index = i;
io_u->flags = IO_U_F_FREE;
*/
static void *thread_main(void *data)
{
- unsigned long long runtime[2];
+ unsigned long long runtime[2], elapsed;
struct thread_data *td = data;
- unsigned long elapsed;
int clear_state;
if (!td->o.use_thread)
goto err;
}
- if (td->ioprio) {
+ if (td->ioprio_set) {
if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) {
td_verror(td, errno, "ioprio_set");
goto err;
static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
{
struct thread_data *td;
- int i, cputhreads, pending, status, ret;
+ int i, cputhreads, realthreads, pending, status, ret;
/*
* reap exited threads (TD_EXITED -> TD_REAPED)
*/
- pending = cputhreads = 0;
+ realthreads = pending = cputhreads = 0;
for_each_td(td, i) {
int flags = 0;
*/
if (td->io_ops && !strcmp(td->io_ops->name, "cpuio"))
cputhreads++;
+ else
+ realthreads++;
if (!td->pid || td->runstate == TD_REAPED)
continue;
exit_value++;
}
- if (*nr_running == cputhreads && !pending)
+ if (*nr_running == cputhreads && !pending && realthreads)
terminate_threads(TERMINATE_ALL);
}