From: Jens Axboe Date: Fri, 12 Dec 2008 19:51:40 +0000 (+0100) Subject: CPU set creation and destruction can fail on some platforms X-Git-Tag: fio-1.24~24 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=d2ce18b5dfdc1736a99b4e2d731119cc4880e197 CPU set creation and destruction can fail on some platforms Check for that and error out if necessary. Signed-off-by: Jens Axboe --- diff --git a/fio.c b/fio.c index 2a468b13..30b40cc7 100644 --- a/fio.c +++ b/fio.c @@ -1116,8 +1116,11 @@ err: 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 8e11227c..f5bc9c07 100644 --- a/options.c +++ b/options.c @@ -247,8 +247,15 @@ static int str_cpumask_cb(void *data, unsigned int *val) struct thread_data *td = data; unsigned int i; long max_cpu; + int ret; + + 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; + } - fio_cpuset_init(td); max_cpu = sysconf(_SC_NPROCESSORS_ONLN); for (i = 0; i < sizeof(int) * 8; i++) { @@ -274,7 +281,12 @@ static int str_cpus_allowed_cb(void *data, const char *input) 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 33380461..03d2450c 100644 --- a/os/os-linux.h +++ b/os/os-linux.h @@ -65,8 +65,17 @@ typedef struct drand48_data os_random_state_t; #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 de948952..6b44ec09 100644 --- a/os/os-solaris.h +++ b/os/os-solaris.h @@ -74,8 +74,30 @@ static inline int fio_set_odirect(int fd) #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