cpus_allowed_policy fixups
authorJens Axboe <axboe@fb.com>
Fri, 28 Feb 2014 23:08:25 +0000 (15:08 -0800)
committerJens Axboe <axboe@fb.com>
Fri, 28 Feb 2014 23:08:25 +0000 (15:08 -0800)
- Make 'split' roundrobin the CPUs, if we have more threads
  than CPUs in the set.

- Properly use a CPU index, don't assume a sequential set of
  CPUs.

Signed-off-by: Jens Axboe <axboe@fb.com>
options.c
os/os-freebsd.h
os/os-linux.h
os/os-solaris.h
os/os-windows.h

index c1a8f323e956986f30155fa0c43976376c449afc..4ff4c9b42a7bd9af3a85251ac2b5a40f20b185d9 100644 (file)
--- a/options.c
+++ b/options.c
@@ -394,16 +394,23 @@ static int str_exitall_cb(void)
 }
 
 #ifdef FIO_HAVE_CPU_AFFINITY
 }
 
 #ifdef FIO_HAVE_CPU_AFFINITY
-int fio_cpus_split(os_cpu_mask_t *mask, unsigned int cpu)
+int fio_cpus_split(os_cpu_mask_t *mask, unsigned int cpu_index)
 {
 {
+       unsigned int i, index, cpus_in_mask;
        const long max_cpu = cpus_online();
        const long max_cpu = cpus_online();
-       unsigned int i;
 
 
+       cpus_in_mask = fio_cpu_count(mask);
+       cpu_index = cpu_index % cpus_in_mask;
+
+       index = 0;
        for (i = 0; i < max_cpu; i++) {
        for (i = 0; i < max_cpu; i++) {
-               if (cpu != i) {
-                       fio_cpu_clear(mask, i);
+               if (!fio_cpu_isset(mask, i))
                        continue;
                        continue;
-               }
+
+               if (cpu_index != index)
+                       fio_cpu_clear(mask, i);
+
+               index++;
        }
 
        return fio_cpu_count(mask);
        }
 
        return fio_cpu_count(mask);
index 402792a0f7d714f99a41c77ad686d39ef561c548..e35c8354ad9b9bd8372153e1579bb88f5b54bd72 100644 (file)
@@ -32,6 +32,7 @@ typedef cpuset_t os_cpu_mask_t;
 
 #define fio_cpu_clear(mask, cpu)        (void) CPU_CLR((cpu), (mask))
 #define fio_cpu_set(mask, cpu)          (void) CPU_SET((cpu), (mask))
 
 #define fio_cpu_clear(mask, cpu)        (void) CPU_CLR((cpu), (mask))
 #define fio_cpu_set(mask, cpu)          (void) CPU_SET((cpu), (mask))
+#define fio_cpu_isset(mask, cpu)       CPU_ISSET((cpu), (mask))
 #define fio_cpu_count(maks)            CPU_COUNT((mask))
 
 static inline int fio_cpuset_init(os_cpu_mask_t *mask)
 #define fio_cpu_count(maks)            CPU_COUNT((mask))
 
 static inline int fio_cpuset_init(os_cpu_mask_t *mask)
index 3ed8c2ef31f2bf855709fbf6b655829bc9083bb2..ef80ce2bd274182ced24cfbdfe76369bde33f4aa 100644 (file)
@@ -61,6 +61,7 @@ typedef struct drand48_data os_random_state_t;
 
 #define fio_cpu_clear(mask, cpu)       (void) CPU_CLR((cpu), (mask))
 #define fio_cpu_set(mask, cpu)         (void) CPU_SET((cpu), (mask))
 
 #define fio_cpu_clear(mask, cpu)       (void) CPU_CLR((cpu), (mask))
 #define fio_cpu_set(mask, cpu)         (void) CPU_SET((cpu), (mask))
+#define fio_cpu_isset(mask, cpu)       CPU_ISSET((cpu), (mask))
 #define fio_cpu_count(maks)            CPU_COUNT((mask))
 
 static inline int fio_cpuset_init(os_cpu_mask_t *mask)
 #define fio_cpu_count(maks)            CPU_COUNT((mask))
 
 static inline int fio_cpuset_init(os_cpu_mask_t *mask)
index 7a0a3f0bfecab77a7e603f690a0350c8facde982..c8896b8c8c01b87d66b3699fa37e1cab14250bdd 100644 (file)
@@ -103,6 +103,31 @@ static inline int fio_set_odirect(int fd)
 #define fio_cpu_clear(mask, cpu)       pset_assign(PS_NONE, (cpu), NULL)
 #define fio_cpu_set(mask, cpu)         pset_assign(*(mask), (cpu), NULL)
 
 #define fio_cpu_clear(mask, cpu)       pset_assign(PS_NONE, (cpu), NULL)
 #define fio_cpu_set(mask, cpu)         pset_assign(*(mask), (cpu), NULL)
 
+static inline int fio_cpu_isset(os_cpu_mask_t *mask, int cpu)
+{
+       const unsigned int max_cpus = cpus_online();
+       processorid_t *cpus;
+       int i, ret;
+
+       cpus = malloc(sizeof(*cpus) * max_cpus);
+
+       if (pset_info(*mask, NULL, &num_cpus, cpus) < 0) {
+               free(cpus);
+               return 0;
+       }
+
+       ret = 0;
+       for (i = 0; i < max_cpus; i++) {
+               if (cpus[i] == cpu) {
+                       ret = 1;
+                       break;
+               }
+       }
+
+       free(cpus);
+       return ret;
+}
+
 static inline int fio_cpuset_init(os_cpu_mask_t *mask)
 {
        if (pset_create(mask) < 0)
 static inline int fio_cpuset_init(os_cpu_mask_t *mask)
 {
        if (pset_create(mask) < 0)
index 243edc676fd94ac15194eb5f8da0d061a15a9039..49f96068ff329ba8bc0b2a69c748f3c8495bbd77 100644 (file)
@@ -215,6 +215,11 @@ static inline void fio_cpu_set(os_cpu_mask_t *mask, int cpu)
        *mask |= 1 << cpu;
 }
 
        *mask |= 1 << cpu;
 }
 
+static inline int fio_cpu_isset(os_cpu_mask_t *mask, int cpu)
+{
+       return (*mask & (1U << cpu));
+}
+
 static inline int fio_cpu_count(os_cpu_mask_t *mask)
 {
        return hweight64(*mask);
 static inline int fio_cpu_count(os_cpu_mask_t *mask)
 {
        return hweight64(*mask);