selftests/powerpc: Fix CPU affinity for child process
authorHarish <harish@linux.ibm.com>
Tue, 9 Jun 2020 08:14:23 +0000 (13:44 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Aug 2020 09:02:03 +0000 (11:02 +0200)
[ Upstream commit 854eb5022be04f81e318765f089f41a57c8e5d83 ]

On systems with large number of cpus, test fails trying to set
affinity by calling sched_setaffinity() with smaller size for affinity
mask. This patch fixes it by making sure that the size of allocated
affinity mask is dependent on the number of CPUs as reported by
get_nprocs().

Fixes: 00b7ec5c9cf3 ("selftests/powerpc: Import Anton's context_switch2 benchmark")
Reported-by: Shirisha Ganta <shiganta@in.ibm.com>
Signed-off-by: Sandipan Das <sandipan@linux.ibm.com>
Signed-off-by: Harish <harish@linux.ibm.com>
Reviewed-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Reviewed-by: Satheesh Rajendran <sathnaga@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200609081423.529664-1-harish@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/testing/selftests/powerpc/benchmarks/context_switch.c

index a36883ad48a451799f3345e048e6e1f5d52ed33e..4b4d2ce912566d872ab3d907a625ea67bfd354eb 100644 (file)
@@ -22,6 +22,7 @@
 #include <limits.h>
 #include <sys/time.h>
 #include <sys/syscall.h>
+#include <sys/sysinfo.h>
 #include <sys/types.h>
 #include <sys/shm.h>
 #include <linux/futex.h>
@@ -97,8 +98,9 @@ static void start_thread_on(void *(*fn)(void *), void *arg, unsigned long cpu)
 
 static void start_process_on(void *(*fn)(void *), void *arg, unsigned long cpu)
 {
-       int pid;
-       cpu_set_t cpuset;
+       int pid, ncpus;
+       cpu_set_t *cpuset;
+       size_t size;
 
        pid = fork();
        if (pid == -1) {
@@ -109,14 +111,23 @@ static void start_process_on(void *(*fn)(void *), void *arg, unsigned long cpu)
        if (pid)
                return;
 
-       CPU_ZERO(&cpuset);
-       CPU_SET(cpu, &cpuset);
+       ncpus = get_nprocs();
+       size = CPU_ALLOC_SIZE(ncpus);
+       cpuset = CPU_ALLOC(ncpus);
+       if (!cpuset) {
+               perror("malloc");
+               exit(1);
+       }
+       CPU_ZERO_S(size, cpuset);
+       CPU_SET_S(cpu, size, cpuset);
 
-       if (sched_setaffinity(0, sizeof(cpuset), &cpuset)) {
+       if (sched_setaffinity(0, sizecpuset)) {
                perror("sched_setaffinity");
+               CPU_FREE(cpuset);
                exit(1);
        }
 
+       CPU_FREE(cpuset);
        fn(arg);
 
        exit(0);