Commit 18337358 authored by Athira Rajeev's avatar Athira Rajeev Committed by Namhyung Kim

tools/perf: Fix perf bench futex to enable the run when some CPU's are offline

Perf bench futex fails as below when attempted to run on
on a powerpc system:

 ./perf bench futex all
 Running futex/hash benchmark...
Run summary [PID 626307]: 80 threads, each operating on 1024 [private] futexes for 10 secs.

perf: pthread_create: No such file or directory

In the setup where this perf bench was ran, difference was that
partition had 640 CPU's, but not all CPUs were online. 80 CPUs
were online. While blocking the threads with futex_wait, code
sets the affinity using cpumask. The cpumask size used is 80
which is picked from "nrcpus = perf_cpu_map__nr(cpu)". Here the
benchmark reports fail while setting affinity for cpu number which
is greater than 80 or higher, because it attempts to set a bit
position which is not allocated on the cpumask. Fix this by changing
the size of cpumask to number of possible cpus and not the number
of online cpus.
Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
Reviewed-by: default avatarIan Rogers <irogers@google.com>
Tested-by: default avatarDisha Goel <disgoel@linux.ibm.com>
Cc: akanksha@linux.ibm.com
Cc: kjain@linux.ibm.com
Cc: maddy@linux.ibm.com
Cc: linuxppc-dev@lists.ozlabs.org
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240607044354.82225-1-atrajeev@linux.vnet.ibm.com
parent 6c1785cd
...@@ -174,7 +174,7 @@ int bench_futex_hash(int argc, const char **argv) ...@@ -174,7 +174,7 @@ int bench_futex_hash(int argc, const char **argv)
pthread_attr_init(&thread_attr); pthread_attr_init(&thread_attr);
gettimeofday(&bench__start, NULL); gettimeofday(&bench__start, NULL);
nrcpus = perf_cpu_map__nr(cpu); nrcpus = cpu__max_cpu().cpu;
cpuset = CPU_ALLOC(nrcpus); cpuset = CPU_ALLOC(nrcpus);
BUG_ON(!cpuset); BUG_ON(!cpuset);
size = CPU_ALLOC_SIZE(nrcpus); size = CPU_ALLOC_SIZE(nrcpus);
......
...@@ -122,7 +122,7 @@ static void create_threads(struct worker *w, struct perf_cpu_map *cpu) ...@@ -122,7 +122,7 @@ static void create_threads(struct worker *w, struct perf_cpu_map *cpu)
{ {
cpu_set_t *cpuset; cpu_set_t *cpuset;
unsigned int i; unsigned int i;
int nrcpus = perf_cpu_map__nr(cpu); int nrcpus = cpu__max_cpu().cpu;
size_t size; size_t size;
threads_starting = params.nthreads; threads_starting = params.nthreads;
......
...@@ -125,7 +125,7 @@ static void block_threads(pthread_t *w, struct perf_cpu_map *cpu) ...@@ -125,7 +125,7 @@ static void block_threads(pthread_t *w, struct perf_cpu_map *cpu)
{ {
cpu_set_t *cpuset; cpu_set_t *cpuset;
unsigned int i; unsigned int i;
int nrcpus = perf_cpu_map__nr(cpu); int nrcpus = cpu__max_cpu().cpu;
size_t size; size_t size;
threads_starting = params.nthreads; threads_starting = params.nthreads;
......
...@@ -149,7 +149,7 @@ static void block_threads(pthread_t *w, struct perf_cpu_map *cpu) ...@@ -149,7 +149,7 @@ static void block_threads(pthread_t *w, struct perf_cpu_map *cpu)
{ {
cpu_set_t *cpuset; cpu_set_t *cpuset;
unsigned int i; unsigned int i;
int nrcpus = perf_cpu_map__nr(cpu); int nrcpus = cpu__max_cpu().cpu;
size_t size; size_t size;
threads_starting = params.nthreads; threads_starting = params.nthreads;
......
...@@ -100,7 +100,7 @@ static void block_threads(pthread_t *w, struct perf_cpu_map *cpu) ...@@ -100,7 +100,7 @@ static void block_threads(pthread_t *w, struct perf_cpu_map *cpu)
cpu_set_t *cpuset; cpu_set_t *cpuset;
unsigned int i; unsigned int i;
size_t size; size_t size;
int nrcpus = perf_cpu_map__nr(cpu); int nrcpus = cpu__max_cpu().cpu;
threads_starting = params.nthreads; threads_starting = params.nthreads;
cpuset = CPU_ALLOC(nrcpus); cpuset = CPU_ALLOC(nrcpus);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment