CPU set creation and destruction can fail on some platforms
Check for that and error out if necessary.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/fio.c b/fio.c
index 2a468b1..30b40cc 100644
--- a/fio.c
+++ b/fio.c
@@ -1116,8 +1116,11 @@
close_ioengine(td);
cleanup_io_u(td);
- if (td->o.cpumask_set)
- fio_cpuset_exit(td);
+ if (td->o.cpumask_set) {
+ int ret = fio_cpuset_exit(&td->o.cpumask);
+
+ td_verror(td, ret, "fio_cpuset_exit");
+ }
/*
* do this very late, it will log file closing as well
diff --git a/options.c b/options.c
index 8e11227..f5bc9c0 100644
--- a/options.c
+++ b/options.c
@@ -247,8 +247,15 @@
struct thread_data *td = data;
unsigned int i;
long max_cpu;
+ int ret;
- fio_cpuset_init(td);
+ ret = fio_cpuset_init(&td->o.cpumask);
+ if (ret < 0) {
+ log_err("fio: cpuset_init failed\n");
+ td_verror(td, ret, "fio_cpuset_init");
+ return 1;
+ }
+
max_cpu = sysconf(_SC_NPROCESSORS_ONLN);
for (i = 0; i < sizeof(int) * 8; i++) {
@@ -274,7 +281,12 @@
long max_cpu;
int ret = 0;
- fio_cpuset_init(td);
+ ret = fio_cpuset_init(&td->o.cpumask);
+ if (ret < 0) {
+ log_err("fio: cpuset_init failed\n");
+ td_verror(td, ret, "fio_cpuset_init");
+ return 1;
+ }
p = str = strdup(input);
diff --git a/os/os-linux.h b/os/os-linux.h
index 3338046..03d2450 100644
--- a/os/os-linux.h
+++ b/os/os-linux.h
@@ -65,8 +65,17 @@
#define fio_cpu_clear(mask, cpu) CPU_CLR((cpu), (mask))
#define fio_cpu_set(mask, cpu) CPU_SET((cpu), (mask))
-#define fio_cpuset_init(td) CPU_ZERO(&(td)->o.cpumask)
-#define fio_cpuset_exit(td) do { } while (0)
+
+static inline int fio_cpuset_init(os_cpu_mask_t *mask)
+{
+ CPU_ZERO(mask);
+ return 0;
+}
+
+static inline int fio_cpuset_exit(os_cpu_mask_t *mask)
+{
+ return 0;
+}
#define FIO_MAX_CPUS CPU_SETSIZE
diff --git a/os/os-solaris.h b/os/os-solaris.h
index de94895..6b44ec0 100644
--- a/os/os-solaris.h
+++ b/os/os-solaris.h
@@ -74,8 +74,30 @@
#define fio_cpu_clear(mask, cpu) pset_assign(*(mask), (cpu), PS_NONE)
#define fio_cpu_set(mask, cpu) pset_assign(*(mask), (cpu), PS_MYID)
-#define fio_cpuset_init(td) pset_create(&(td)->o.cpumask)
-#define fio_cpuset_exit(td) pset_destroy((td)->o.cpumask)
+
+static inline int fio_cpuset_init(os_cpu_mask_t *mask)
+{
+ int ret;
+
+ if (pset_create(mask) < 0) {
+ ret = errno;
+ return -1;
+ }
+
+ return 0;
+}
+
+static inline int fio_cpuset_exit(os_cpu_mask_t *mask)
+{
+ int ret;
+
+ if (pset_destroy(*mask) < 0) {
+ ret = errno;
+ return -1;
+ }
+
+ return 0;
+}
/*
* Should be enough, not aware of what (if any) restrictions Solaris has