X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=options.c;h=04ed548d97b5a992cf6e50e220f64c9d5b43075c;hp=aeba5201e7303a2d83d9e34e7a3110dc0be2f7a4;hb=7172cfe8e0e918cc279eb501986f6ec78cc7aad9;hpb=160b966d83adace2629de10f85ed269ab2e587f5 diff --git a/options.c b/options.c index aeba5201..04ed548d 100644 --- a/options.c +++ b/options.c @@ -64,6 +64,13 @@ static int str_lockmem_cb(void fio_unused *data, unsigned long *val) static int str_prioclass_cb(void *data, unsigned int *val) { struct thread_data *td = data; + unsigned short mask; + + /* + * mask off old class bits, str_prio_cb() may have set a default class + */ + mask = (1 << IOPRIO_CLASS_SHIFT) - 1; + td->ioprio &= mask; td->ioprio |= *val << IOPRIO_CLASS_SHIFT; return 0; @@ -74,6 +81,13 @@ static int str_prio_cb(void *data, unsigned int *val) struct thread_data *td = data; td->ioprio |= *val; + + /* + * If no class is set, assume BE + */ + if ((td->ioprio >> IOPRIO_CLASS_SHIFT) == 0) + td->ioprio |= IOPRIO_CLASS_BE << IOPRIO_CLASS_SHIFT; + return 0; } #endif @@ -84,27 +98,46 @@ static int str_exitall_cb(void) return 0; } -static void fill_cpu_mask(os_cpu_mask_t cpumask, int cpu) -{ #ifdef FIO_HAVE_CPU_AFFINITY +static int str_cpumask_cb(void *data, unsigned int *val) +{ + struct thread_data *td = data; unsigned int i; - CPU_ZERO(&cpumask); + CPU_ZERO(&td->o.cpumask); - for (i = 0; i < sizeof(int) * 8; i++) { - if ((1 << i) & cpu) - CPU_SET(i, &cpumask); - } -#endif + for (i = 0; i < sizeof(int) * 8; i++) + if ((1 << i) & *val) + CPU_SET(*val, &td->o.cpumask); + + td->o.cpumask_set = 1; + return 0; } -static int str_cpumask_cb(void *data, unsigned int *val) +static int str_cpus_allowed_cb(void *data, const char *input) { struct thread_data *td = data; + char *cpu, *str, *p; + + CPU_ZERO(&td->o.cpumask); + + p = str = strdup(input); - fill_cpu_mask(td->o.cpumask, *val); + strip_blank_front(&str); + strip_blank_end(str); + + while ((cpu = strsep(&str, ",")) != NULL) { + if (!strlen(cpu)) + break; + CPU_SET(atoi(cpu), &td->o.cpumask); + } + + free(p); + td->o.cpumask_set = 1; + exit(0); return 0; } +#endif static int str_fst_cb(void *data, const char *str) { @@ -280,6 +313,9 @@ static struct fio_option options[] = { { .ival = "splice", .help = "splice/vmsplice based IO", }, + { .ival = "netsplice", + .help = "splice/vmsplice to/from the network", + }, #endif #ifdef FIO_HAVE_SGIO { .ival = "sg", @@ -333,6 +369,7 @@ static struct fio_option options[] = { .name = "size", .type = FIO_OPT_STR_VAL, .off1 = td_var_offset(size), + .minval = 1, .help = "Total size of device or files", }, { @@ -340,6 +377,7 @@ static struct fio_option options[] = { .type = FIO_OPT_STR_VAL, .off1 = td_var_offset(file_size_low), .off2 = td_var_offset(file_size_high), + .minval = 1, .help = "Size of individual files", }, { @@ -348,6 +386,7 @@ static struct fio_option options[] = { .type = FIO_OPT_STR_VAL_INT, .off1 = td_var_offset(bs[DDIR_READ]), .off2 = td_var_offset(bs[DDIR_WRITE]), + .minval = 1, .help = "Block size unit", .def = "4k", }, @@ -359,6 +398,7 @@ static struct fio_option options[] = { .off2 = td_var_offset(max_bs[DDIR_READ]), .off3 = td_var_offset(min_bs[DDIR_WRITE]), .off4 = td_var_offset(max_bs[DDIR_WRITE]), + .minval = 1, .help = "Set block size range (in more detail than bs)", }, { @@ -477,6 +517,12 @@ static struct fio_option options[] = { .help = "Stop workload when this amount of time has passed", .def = "0", }, + { + .name = "time_based", + .type = FIO_OPT_STR_SET, + .off1 = td_var_offset(time_based), + .help = "Keep running until runtime/timeout is met", + }, { .name = "mem", .alias = "iomem", @@ -755,6 +801,12 @@ static struct fio_option options[] = { .cb = str_cpumask_cb, .help = "CPU affinity mask", }, + { + .name = "cpus_allowed", + .type = FIO_OPT_STR, + .cb = str_cpus_allowed_cb, + .help = "Set CPUs allowed", + }, #endif { .name = "end_fsync", @@ -826,6 +878,21 @@ static struct fio_option options[] = { .off1 = td_var_offset(group_reporting), .help = "Do reporting on a per-group basis", }, + { + .name = "zero_buffers", + .type = FIO_OPT_STR_SET, + .off1 = td_var_offset(zero_buffers), + .help = "Init IO buffers to all zeroes", + }, +#ifdef FIO_HAVE_DISK_UTIL + { + .name = "disk_util", + .type = FIO_OPT_BOOL, + .off1 = td_var_offset(do_disk_util), + .help = "Log disk utilization stats", + .def = "1", + }, +#endif { .name = NULL, }, @@ -908,7 +975,9 @@ void options_mem_dupe(struct thread_data *td) __options_mem(td, 1); } -void options_mem_free(struct thread_data *td) +void options_mem_free(struct thread_data fio_unused *td) { +#if 0 __options_mem(td, 0); +#endif }