mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-18 02:46:06 +00:00
libperf: Add perf_cpu_map__refcnt() interanl accessor to use in the maps test
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>
This commit is contained in:
parent
17354d1528
commit
4121234a32
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user