From d1301afd71bd38b1610b391e50debf766faa84be Mon Sep 17 00:00:00 2001 From: Michael Ellerman Date: Wed, 16 Dec 2015 18:59:31 +1100 Subject: 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 --- tools/testing/selftests/powerpc/utils.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'tools/testing/selftests/powerpc/utils.c') 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 #include #include #include +#include #include #include #include @@ -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; +} -- cgit v1.2.3-59-g8ed1b