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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html