From: Jens Axboe Date: Fri, 15 Jun 2007 08:33:49 +0000 (+0200) Subject: Add cpus_allowed option X-Git-Tag: fio-1.16.5~7 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=d2e268b09bc8ab95af81e5636608dcd93f40e4c1 Add cpus_allowed option cpumask can be cumbersome to use, since it requires you to calculate a decimal mask to pass to fio. So add a cpus_allowed option that takes a text list of allowed cpus, ala: cpus_allowed=1,3,8 will set the affinity mask for CPUS 1, 3, and 8. Signed-off-by: Jens Axboe --- diff --git a/HOWTO b/HOWTO index 7e706aba..0c243076 100644 --- a/HOWTO +++ b/HOWTO @@ -472,6 +472,10 @@ cpumask=int Set the CPU affinity of this job. The parameter given is a sched_setaffinity(2). This may not work on all supported operating systems or kernel versions. +cpus_allowed=str Controls the same options as cpumask, but it allows a text + setting of the permitted CPUs instead. So to use CPUs 1 and + 5, you would specify cpus_allowed=1,5. + startdelay=int Start this job the specified number of seconds after fio has started. Only useful if the job file contains several jobs, and you want to delay starting some jobs to a certain diff --git a/README b/README index a56f6337..a646de0f 100644 --- a/README +++ b/README @@ -129,6 +129,7 @@ The job file parameters are: ratemin=x Quit if rate of x KiB/sec can't be met ratecycle=x ratemin averaged over x msecs cpumask=x Only allow job to run on CPUs defined by mask. + cpus_allowed=x Like 'cpumask', but allow text setting of CPU affinity. fsync=x If writing with buffered IO, fsync after every 'x' blocks have been written. end_fsync=x If 'x', run fsync() after end-of-job. diff --git a/options.c b/options.c index 839af0bf..db3279e1 100644 --- a/options.c +++ b/options.c @@ -98,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 + 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) { @@ -775,6 +794,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",