aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/powerpc/utils.c
diff options
context:
space:
mode:
authorMichael Ellerman <mpe@ellerman.id.au>2015-12-16 18:59:31 +1100
committerMichael Ellerman <mpe@ellerman.id.au>2015-12-17 10:46:41 +1100
commitd1301afd71bd38b1610b391e50debf766faa84be (patch)
treeec86ca9e28aa61b7bd145538fe6e1230a0cd63d3 /tools/testing/selftests/powerpc/utils.c
parentpowerpc: Remove broken GregorianDay() (diff)
downloadlinux-dev-d1301afd71bd38b1610b391e50debf766faa84be.tar.xz
linux-dev-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.c29
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;
+}