On Tue, Jun 09, 2020 at 01:44:23PM +0530, Harish wrote: > 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 <shiga...@in.ibm.com> > Signed-off-by: Sandipan Das <sandi...@linux.ibm.com> > Signed-off-by: Harish <har...@linux.ibm.com> > ---
Reviewed-by: Satheesh Rajendran <sathn...@linux.vnet.ibm.com> > v2: > https://lore.kernel.org/linuxppc-dev/20200609034005.520137-1-har...@linux.ibm.com/ > > Changes from v2: > - Interchanged size and ncpus as suggested by Satheesh > - Revert the exit code as suggested by Satheesh > - Added NULL check for the affinity mask as suggested by Kamalesh > - Freed the affinity mask allocation after affinity is set > as suggested by Kamalesh > - Changed "cpu set" to "affinity mask" in the commit message > > --- > .../powerpc/benchmarks/context_switch.c | 21 ++++++++++++++----- > 1 file changed, 16 insertions(+), 5 deletions(-) > > diff --git a/tools/testing/selftests/powerpc/benchmarks/context_switch.c > b/tools/testing/selftests/powerpc/benchmarks/context_switch.c > index a2e8c9da7fa5..d50cc05df495 100644 > --- a/tools/testing/selftests/powerpc/benchmarks/context_switch.c > +++ b/tools/testing/selftests/powerpc/benchmarks/context_switch.c > @@ -19,6 +19,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> > @@ -104,8 +105,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) { > @@ -116,14 +118,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, size, cpuset)) { > perror("sched_setaffinity"); > + CPU_FREE(cpuset); > exit(1); > } > > + CPU_FREE(cpuset); > fn(arg); > > exit(0); > -- > 2.24.1 >