libperf tests: Fix test_stat_cpu
authorShunsuke Nakamura <nakamura.shun@fujitsu.com>
Mon, 11 Oct 2021 08:37:04 +0000 (17:37 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 27 Oct 2021 07:56:55 +0000 (09:56 +0200)
[ Upstream commit 3ff6d64e68abc231955d216236615918797614ae ]

The `cpu` argument of perf_evsel__read() must specify the cpu index.

perf_cpu_map__for_each_cpu() is for iterating the cpu number (not index)
and is thus not appropriate for use with perf_evsel__read().

So, if there is an offline CPU, the cpu number specified in the argument
may point out of range because the cpu number and the cpu index are
different.

Fix test_stat_cpu().

Testing it:

  # make tests -C tools/lib/perf/
  make: Entering directory '/home/nakamura/kernel_src/linux-5.15-rc4_fix/tools/lib/perf'
  running static:
  - running tests/test-cpumap.c...OK
  - running tests/test-threadmap.c...OK
  - running tests/test-evlist.c...OK
  - running tests/test-evsel.c...OK
  running dynamic:
  - running tests/test-cpumap.c...OK
  - running tests/test-threadmap.c...OK
  - running tests/test-evlist.c...OK
  - running tests/test-evsel.c...OK
  make: Leaving directory '/home/nakamura/kernel_src/linux-5.15-rc4_fix/tools/lib/perf'

Signed-off-by: Shunsuke Nakamura <nakamura.shun@fujitsu.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20211011083704.4108720-1-nakamura.shun@fujitsu.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/lib/perf/tests/test-evlist.c
tools/lib/perf/tests/test-evsel.c

index bd19cab..60b5d18 100644 (file)
@@ -38,7 +38,7 @@ static int test_stat_cpu(void)
                .type   = PERF_TYPE_SOFTWARE,
                .config = PERF_COUNT_SW_TASK_CLOCK,
        };
-       int err, cpu, tmp;
+       int err, idx;
 
        cpus = perf_cpu_map__new(NULL);
        __T("failed to create cpus", cpus);
@@ -64,10 +64,10 @@ static int test_stat_cpu(void)
        perf_evlist__for_each_evsel(evlist, evsel) {
                cpus = perf_evsel__cpus(evsel);
 
-               perf_cpu_map__for_each_cpu(cpu, tmp, cpus) {
+               for (idx = 0; idx < perf_cpu_map__nr(cpus); idx++) {
                        struct perf_counts_values counts = { .val = 0 };
 
-                       perf_evsel__read(evsel, cpu, 0, &counts);
+                       perf_evsel__read(evsel, idx, 0, &counts);
                        __T("failed to read value for evsel", counts.val != 0);
                }
        }
index 0ad82d7..2de9876 100644 (file)
@@ -21,7 +21,7 @@ static int test_stat_cpu(void)
                .type   = PERF_TYPE_SOFTWARE,
                .config = PERF_COUNT_SW_CPU_CLOCK,
        };
-       int err, cpu, tmp;
+       int err, idx;
 
        cpus = perf_cpu_map__new(NULL);
        __T("failed to create cpus", cpus);
@@ -32,10 +32,10 @@ static int test_stat_cpu(void)
        err = perf_evsel__open(evsel, cpus, NULL);
        __T("failed to open evsel", err == 0);
 
-       perf_cpu_map__for_each_cpu(cpu, tmp, cpus) {
+       for (idx = 0; idx < perf_cpu_map__nr(cpus); idx++) {
                struct perf_counts_values counts = { .val = 0 };
 
-               perf_evsel__read(evsel, cpu, 0, &counts);
+               perf_evsel__read(evsel, idx, 0, &counts);
                __T("failed to read value for evsel", counts.val != 0);
        }