for (i = 0; i < sizeof(int) * 8; i++) {
if ((1 << i) & *val) {
- if (i > max_cpu) {
+ if (i >= max_cpu) {
log_err("fio: CPU %d too large (max=%ld)\n", i,
- max_cpu);
+ max_cpu - 1);
return 1;
}
dprint(FD_PARSE, "set cpu allowed %d\n", i);
ret = 1;
break;
}
- if (icpu > max_cpu) {
+ if (icpu >= max_cpu) {
log_err("fio: CPU %d too large (max=%ld)\n",
- icpu, max_cpu);
+ icpu, max_cpu - 1);
ret = 1;
break;
}
.category = FIO_OPT_C_IO,
.group = FIO_OPT_G_IO_BASIC,
},
+ {
+ .name = "io_submit_mode",
+ .lname = "IO submit mode",
+ .type = FIO_OPT_STR,
+ .off1 = td_var_offset(io_submit_mode),
+ .help = "How IO submissions and completions are done",
+ .def = "inline",
+ .category = FIO_OPT_C_IO,
+ .group = FIO_OPT_G_IO_BASIC,
+ .posval = {
+ { .ival = "inline",
+ .oval = IO_MODE_INLINE,
+ .help = "Submit and complete IO inline",
+ },
+ { .ival = "offload",
+ .oval = IO_MODE_OFFLOAD,
+ .help = "Offload submit and complete to threads",
+ },
+ },
+ },
{
.name = "size",
.lname = "Size",
struct group_run_stats *runstats, *rs;
struct thread_data *td;
struct thread_stat *threadstats, *ts;
- int i, j, nr_ts, last_ts, idx;
+ int i, j, k, nr_ts, last_ts, idx;
int kb_base_warned = 0;
int unit_base_warned = 0;
struct json_object *root = NULL;
ts->latency_window = td->o.latency_window;
ts->nr_block_infos = td->ts.nr_block_infos;
- for (i = 0; i < ts->nr_block_infos; i++)
- ts->block_infos[i] = td->ts.block_infos[i];
+ for (k = 0; k < ts->nr_block_infos; k++)
+ ts->block_infos[k] = td->ts.block_infos[k];
sum_thread_stats(ts, &td->ts, idx);
}
if (spent < td->o.bw_avg_time)
return;
+ td_io_u_lock(td);
+
/*
* Compute both read and write rates for the interval.
*/
}
fio_gettime(&td->bw_sample_time, NULL);
+ td_io_u_unlock(td);
}
void add_iops_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs,
if (spent < td->o.iops_avg_time)
return;
+ td_io_u_lock(td);
+
/*
* Compute both read and write rates for the interval.
*/
}
fio_gettime(&td->iops_sample_time, NULL);
+ td_io_u_unlock(td);
}
void stat_init(void)