diff options
author | Michael Ellerman <mpe@ellerman.id.au> | 2015-12-16 18:59:31 +1100 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2015-12-17 10:46:41 +1100 |
commit | d1301afd71bd38b1610b391e50debf766faa84be (patch) | |
tree | ec86ca9e28aa61b7bd145538fe6e1230a0cd63d3 /tools/testing/selftests/powerpc/utils.c | |
parent | 00b912b0c88e690b1662067497182454357b18b0 (diff) | |
download | lwn-d1301afd71bd38b1610b391e50debf766faa84be.tar.gz lwn-d1301afd71bd38b1610b391e50debf766faa84be.zip |
selftests/powerpc: Move pick_online_cpu() up into utils.c
We want to use this in another test, so make it available at the top of
the powerpc selftests tree.
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'tools/testing/selftests/powerpc/utils.c')
-rw-r--r-- | tools/testing/selftests/powerpc/utils.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/tools/testing/selftests/powerpc/utils.c b/tools/testing/selftests/powerpc/utils.c index 536113add380..dcf74184bfd0 100644 --- a/tools/testing/selftests/powerpc/utils.c +++ b/tools/testing/selftests/powerpc/utils.c @@ -3,10 +3,13 @@ * Licensed under GPLv2. */ +#define _GNU_SOURCE /* For CPU_ZERO etc. */ + #include <elf.h> #include <errno.h> #include <fcntl.h> #include <link.h> +#include <sched.h> #include <stdio.h> #include <sys/stat.h> #include <sys/types.h> @@ -56,3 +59,29 @@ out: close(fd); return result; } + +int pick_online_cpu(void) +{ + cpu_set_t mask; + int cpu; + + CPU_ZERO(&mask); + + if (sched_getaffinity(0, sizeof(mask), &mask)) { + perror("sched_getaffinity"); + return -1; + } + + /* We prefer a primary thread, but skip 0 */ + for (cpu = 8; cpu < CPU_SETSIZE; cpu += 8) + if (CPU_ISSET(cpu, &mask)) + return cpu; + + /* Search for anything, but in reverse */ + for (cpu = CPU_SETSIZE - 1; cpu >= 0; cpu--) + if (CPU_ISSET(cpu, &mask)) + return cpu; + + printf("No cpus in affinity mask?!\n"); + return -1; +} |