perf tools: Fix sparse CPU numbering related bugs
At present, the perf subcommands that do system-wide monitoring (perf stat, perf record and perf top) don't work properly unless the online cpus are numbered 0, 1, ..., N-1. These tools ask for the number of online cpus with sysconf(_SC_NPROCESSORS_ONLN) and then try to create events for cpus 0, 1, ..., N-1. This creates problems for systems where the online cpus are numbered sparsely. For example, a POWER6 system in single-threaded mode (i.e. only running 1 hardware thread per core) will have only even-numbered cpus online. This fixes the problem by reading the /sys/devices/system/cpu/online file to find out which cpus are online. The code that does that is in tools/perf/util/cpumap.[ch], and consists of a read_cpu_map() function that sets up a cpumap[] array and returns the number of online cpus. If /sys/devices/system/cpu/online can't be read or can't be parsed successfully, it falls back to using sysconf to ask how many cpus are online and sets up an identity map in cpumap[]. The perf record, perf stat and perf top code then calls read_cpu_map() in the system-wide monitoring case (instead of sysconf) and uses cpumap[] to get the cpu numbers to pass to perf_event_open. Signed-off-by:Paul Mackerras <paulus@samba.org> Cc: Anton Blanchard <anton@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@infradead.org> LKML-Reference: <20100310093609.GA3959@brick.ozlabs.ibm.com> Signed-off-by:
Ingo Molnar <mingo@elte.hu>
Showing
- tools/perf/Makefile 2 additions, 0 deletionstools/perf/Makefile
- tools/perf/builtin-record.c 3 additions, 4 deletionstools/perf/builtin-record.c
- tools/perf/builtin-stat.c 6 additions, 4 deletionstools/perf/builtin-stat.c
- tools/perf/builtin-top.c 4 additions, 5 deletionstools/perf/builtin-top.c
- tools/perf/util/cpumap.c 59 additions, 0 deletionstools/perf/util/cpumap.c
- tools/perf/util/cpumap.h 7 additions, 0 deletionstools/perf/util/cpumap.h
Loading
Please register or sign in to comment