OSDN Git Service

libperf: Add perf_cpu_map__refcnt() interanl accessor to use in the maps test
authorArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 17 Apr 2023 15:47:49 +0000 (12:47 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 17 Apr 2023 18:52:36 +0000 (15:52 -0300)
To remove one more direct access to 'struct perf_cpu_map' so that we can
intercept accesses to its instantiations and refcount check it to catch
use after free, etc.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Riccardo Mancini <rickyman7@gmail.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
Link: https://lore.kernel.org/lkml/ZD1qdYjG+DL6KOfP@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/perf/cpumap.c
tools/lib/perf/include/internal/cpumap.h
tools/perf/tests/cpumap.c

index 6bbcbb8..27c3e73 100644 (file)
@@ -40,7 +40,7 @@ struct perf_cpu_map *perf_cpu_map__dummy_new(void)
 static void cpu_map__delete(struct perf_cpu_map *map)
 {
        if (map) {
-               WARN_ONCE(refcount_read(&map->refcnt) != 0,
+               WARN_ONCE(refcount_read(perf_cpu_map__refcnt(map)) != 0,
                          "cpu_map refcnt unbalanced\n");
                free(map);
        }
@@ -49,13 +49,13 @@ static void cpu_map__delete(struct perf_cpu_map *map)
 struct perf_cpu_map *perf_cpu_map__get(struct perf_cpu_map *map)
 {
        if (map)
-               refcount_inc(&map->refcnt);
+               refcount_inc(perf_cpu_map__refcnt(map));
        return map;
 }
 
 void perf_cpu_map__put(struct perf_cpu_map *map)
 {
-       if (map && refcount_dec_and_test(&map->refcnt))
+       if (map && refcount_dec_and_test(perf_cpu_map__refcnt(map)))
                cpu_map__delete(map);
 }
 
index b82fd66..1e840dd 100644 (file)
@@ -30,4 +30,8 @@ bool perf_cpu_map__is_subset(const struct perf_cpu_map *a, const struct perf_cpu
 
 void perf_cpu_map__set_nr(struct perf_cpu_map *map, int nr_cpus);
 
+static inline refcount_t *perf_cpu_map__refcnt(struct perf_cpu_map *map)
+{
+       return &map->refcnt;
+}
 #endif /* __LIBPERF_INTERNAL_CPUMAP_H */
index 3150fc1..b1a9243 100644 (file)
@@ -68,7 +68,7 @@ static int process_event_cpus(struct perf_tool *tool __maybe_unused,
        TEST_ASSERT_VAL("wrong nr",  perf_cpu_map__nr(map) == 2);
        TEST_ASSERT_VAL("wrong cpu", perf_cpu_map__cpu(map, 0).cpu == 1);
        TEST_ASSERT_VAL("wrong cpu", perf_cpu_map__cpu(map, 1).cpu == 256);
-       TEST_ASSERT_VAL("wrong refcnt", refcount_read(&map->refcnt) == 1);
+       TEST_ASSERT_VAL("wrong refcnt", refcount_read(perf_cpu_map__refcnt(map)) == 1);
        perf_cpu_map__put(map);
        return 0;
 }
@@ -94,7 +94,7 @@ static int process_event_range_cpus(struct perf_tool *tool __maybe_unused,
        TEST_ASSERT_VAL("wrong nr",  perf_cpu_map__nr(map) == 256);
        TEST_ASSERT_VAL("wrong cpu", perf_cpu_map__cpu(map, 0).cpu == 1);
        TEST_ASSERT_VAL("wrong cpu", perf_cpu_map__max(map).cpu == 256);
-       TEST_ASSERT_VAL("wrong refcnt", refcount_read(&map->refcnt) == 1);
+       TEST_ASSERT_VAL("wrong refcnt", refcount_read(perf_cpu_map__refcnt(map)) == 1);
        perf_cpu_map__put(map);
        return 0;
 }