Add cpus_allowed option
authorJens Axboe <jens.axboe@oracle.com>
Fri, 15 Jun 2007 08:33:49 +0000 (10:33 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Fri, 15 Jun 2007 08:33:49 +0000 (10:33 +0200)
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 <jens.axboe@oracle.com>
HOWTO
README
options.c

diff --git a/HOWTO b/HOWTO
index 7e706aba1481e68c97fbb66e57a85ccc28649b8c..0c243076ef65be503d7fc17d63ba4f7737182ec9 100644 (file)
--- 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 a56f633767a36958d8818087d1bf6eeadce91e0b..a646de0fa8f17b8a31577c836aead8c93182f55f 100644 (file)
--- 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.
index 839af0bffbdc5f3d4e2c5c6488ef6d7debadef4b..db3279e13a0dba66293e36610b3f54621efdf792 100644 (file)
--- 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",