| From 647380798cbce65e31d801bb866ab7bc4c1c8449 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 30 Jul 2020 10:38:46 +0530 |
| Subject: selftests/powerpc: Fix online CPU selection |
| |
| From: Sandipan Das <sandipan@linux.ibm.com> |
| |
| [ Upstream commit dfa03fff86027e58c8dba5c03ae68150d4e513ad ] |
| |
| The size of the CPU affinity mask must be large enough for |
| systems with a very large number of CPUs. Otherwise, tests |
| which try to determine the first online CPU by calling |
| sched_getaffinity() will fail. This makes sure that the size |
| of the allocated affinity mask is dependent on the number of |
| CPUs as reported by get_nprocs_conf(). |
| |
| Fixes: 3752e453f6ba ("selftests/powerpc: Add tests of PMU EBBs") |
| Reported-by: Shirisha Ganta <shiganta@in.ibm.com> |
| Signed-off-by: Sandipan Das <sandipan@linux.ibm.com> |
| Reviewed-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/a408c4b8e9a23bb39b539417a21eb0ff47bb5127.1596084858.git.sandipan@linux.ibm.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/testing/selftests/powerpc/utils.c | 37 +++++++++++++++++-------- |
| 1 file changed, 25 insertions(+), 12 deletions(-) |
| |
| diff --git a/tools/testing/selftests/powerpc/utils.c b/tools/testing/selftests/powerpc/utils.c |
| index 5ee0e98c48967..eb530e73e02c1 100644 |
| --- a/tools/testing/selftests/powerpc/utils.c |
| +++ b/tools/testing/selftests/powerpc/utils.c |
| @@ -16,6 +16,7 @@ |
| #include <string.h> |
| #include <sys/ioctl.h> |
| #include <sys/stat.h> |
| +#include <sys/sysinfo.h> |
| #include <sys/types.h> |
| #include <sys/utsname.h> |
| #include <unistd.h> |
| @@ -88,28 +89,40 @@ void *get_auxv_entry(int type) |
| |
| int pick_online_cpu(void) |
| { |
| - cpu_set_t mask; |
| - int cpu; |
| + int ncpus, cpu = -1; |
| + cpu_set_t *mask; |
| + size_t size; |
| + |
| + ncpus = get_nprocs_conf(); |
| + size = CPU_ALLOC_SIZE(ncpus); |
| + mask = CPU_ALLOC(ncpus); |
| + if (!mask) { |
| + perror("malloc"); |
| + return -1; |
| + } |
| |
| - CPU_ZERO(&mask); |
| + CPU_ZERO_S(size, mask); |
| |
| - if (sched_getaffinity(0, sizeof(mask), &mask)) { |
| + if (sched_getaffinity(0, size, mask)) { |
| perror("sched_getaffinity"); |
| - return -1; |
| + goto done; |
| } |
| |
| /* We prefer a primary thread, but skip 0 */ |
| - for (cpu = 8; cpu < CPU_SETSIZE; cpu += 8) |
| - if (CPU_ISSET(cpu, &mask)) |
| - return cpu; |
| + for (cpu = 8; cpu < ncpus; cpu += 8) |
| + if (CPU_ISSET_S(cpu, size, mask)) |
| + goto done; |
| |
| /* Search for anything, but in reverse */ |
| - for (cpu = CPU_SETSIZE - 1; cpu >= 0; cpu--) |
| - if (CPU_ISSET(cpu, &mask)) |
| - return cpu; |
| + for (cpu = ncpus - 1; cpu >= 0; cpu--) |
| + if (CPU_ISSET_S(cpu, size, mask)) |
| + goto done; |
| |
| printf("No cpus in affinity mask?!\n"); |
| - return -1; |
| + |
| +done: |
| + CPU_FREE(mask); |
| + return cpu; |
| } |
| |
| bool is_ppc64le(void) |
| -- |
| 2.25.1 |
| |