The following changes since commit a1fc70fbb0497a4e0dc061bd8fc35c8d4d29d2dd: windows: fix fio_cpu_count() definition (2014-02-27 16:24:15 -0800) are available in the git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to ada083cdf71779d7969318e12e91ad18f5864485: Update cpus_allowed_policy=split documentation (2014-02-28 16:43:57 -0800) ---------------------------------------------------------------- Jens Axboe (3): Fix off-by-one bug in CPU split mask handling cpus_allowed_policy fixups Update cpus_allowed_policy=split documentation Peter Oberparleiter (1): fio: fix last block never being touched by random offsets HOWTO | 5 +++-- backend.c | 2 +- fio.1 | 5 +++-- io_u.c | 2 +- options.c | 17 ++++++++++++----- os/os-freebsd.h | 1 + os/os-linux.h | 1 + os/os-solaris.h | 25 +++++++++++++++++++++++++ os/os-windows.h | 5 +++++ 9 files changed, 52 insertions(+), 11 deletions(-) --- Diff of recent changes: diff --git a/HOWTO b/HOWTO index ef2b631..9a9f02a 100644 --- a/HOWTO +++ b/HOWTO @@ -936,8 +936,9 @@ cpus_allowed_policy=str Set the policy of how fio distributes the CPUs split Each job will get a unique CPU from the CPU set. 'shared' is the default behaviour, if the option isn't - specified. If split is specified, then fio will error out if - there are more jobs defined than CPUs given in the set. + specified. If split is specified, then fio will will assign + one cpu per job. If not enough CPUs are given for the jobs + listed, then fio will roundrobin the CPUs in the set. numa_cpu_nodes=str Set this job running on spcified NUMA nodes' CPUs. The arguments allow comma delimited list of cpu numbers, diff --git a/backend.c b/backend.c index 12c76d8..72d9d6d 100644 --- a/backend.c +++ b/backend.c @@ -1279,7 +1279,7 @@ static void *thread_main(void *data) */ if (o->cpumask_set) { if (o->cpus_allowed_policy == FIO_CPUS_SPLIT) { - ret = fio_cpus_split(&o->cpumask, td->thread_number); + ret = fio_cpus_split(&o->cpumask, td->thread_number - 1); if (!ret) { log_err("fio: no CPUs set\n"); log_err("fio: Try increasing number of available CPUs\n"); diff --git a/fio.1 b/fio.1 index 863b0e0..764e323 100644 --- a/fio.1 +++ b/fio.1 @@ -847,8 +847,9 @@ Each job will get a unique CPU from the CPU set. .RE .P \fBshared\fR is the default behaviour, if the option isn't specified. If -\fBsplit\fR is specified, then fio will error out if there are more jobs -defined than CPUs given in the set. +\fBsplit\fR is specified, then fio will assign one cpu per job. If not enough +CPUs are given for the jobs listed, then fio will roundrobin the CPUs in +the set. .RE .P .TP diff --git a/io_u.c b/io_u.c index 77557df..75b23eb 100644 --- a/io_u.c +++ b/io_u.c @@ -104,7 +104,7 @@ static int __get_next_rand_offset(struct thread_data *td, struct fio_file *f, dprint(FD_RANDOM, "off rand %llu\n", (unsigned long long) r); - *b = (lastb - 1) * (r / ((uint64_t) rmax + 1.0)); + *b = lastb * (r / ((uint64_t) rmax + 1.0)); } else { uint64_t off = 0; diff --git a/options.c b/options.c index c1a8f32..4ff4c9b 100644 --- a/options.c +++ b/options.c @@ -394,16 +394,23 @@ static int str_exitall_cb(void) } #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(); - 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++) { - if (cpu != i) { - fio_cpu_clear(mask, i); + if (!fio_cpu_isset(mask, i)) continue; - } + + if (cpu_index != index) + fio_cpu_clear(mask, i); + + index++; } return fio_cpu_count(mask); diff --git a/os/os-freebsd.h b/os/os-freebsd.h index 402792a..e35c835 100644 --- a/os/os-freebsd.h +++ b/os/os-freebsd.h @@ -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_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) diff --git a/os/os-linux.h b/os/os-linux.h index 3ed8c2e..ef80ce2 100644 --- a/os/os-linux.h +++ b/os/os-linux.h @@ -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_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) diff --git a/os/os-solaris.h b/os/os-solaris.h index 7a0a3f0..c8896b8 100644 --- a/os/os-solaris.h +++ b/os/os-solaris.h @@ -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) +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) diff --git a/os/os-windows.h b/os/os-windows.h index 243edc6..49f9606 100644 --- a/os/os-windows.h +++ b/os/os-windows.h @@ -215,6 +215,11 @@ static inline void fio_cpu_set(os_cpu_mask_t *mask, int 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); -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html