summaryrefslogtreecommitdiff
path: root/tools/perf/util/symbol.c
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2023-04-19 10:48:37 -0300
committerArnaldo Carvalho de Melo <acme@redhat.com>2023-04-19 10:53:01 -0300
commit8f12692b7e61e5fb5d3e4f6692d6675f62eeebdc (patch)
treec3c653ed2524b984c7b4ae279d6a096f344fd569 /tools/perf/util/symbol.c
parenta07dacad8ac40d1beadb640fe341b5198c1cf097 (diff)
downloadlinux-8f12692b7e61e5fb5d3e4f6692d6675f62eeebdc.tar.gz
linux-8f12692b7e61e5fb5d3e4f6692d6675f62eeebdc.tar.bz2
linux-8f12692b7e61e5fb5d3e4f6692d6675f62eeebdc.zip
perf maps: Add reference count checking
Add reference count checking to make sure of good use of get and put. Add and use accessors to reduce RC_CHK clutter. The only significant issue was in tests/thread-maps-share.c where reference counts were released in the reverse order to acquisition, leading to a use after put. This was fixed by reversing the put order. Committer notes: Extracted from a larger patch removing bits that were covered by the use of pre-existing maps__ accessors (e.g. maps__nr_maps()) and new ones added (maps__refcnt()) to reduce RC_CHK_ACCESS(maps)-> source code pollution. Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com> Cc: Dmitriy Vyukov <dvyukov@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/20230407230405.2931830-5-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/symbol.c')
-rw-r--r--tools/perf/util/symbol.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index e7f63670688e..01fa5560a0bb 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -2096,8 +2096,8 @@ static int map__groups__sort_by_name_from_rbtree(struct maps *maps)
up_read(maps__lock(maps));
down_write(maps__lock(maps));
- maps->maps_by_name = maps_by_name;
- maps->nr_maps_allocated = maps__nr_maps(maps);
+ RC_CHK_ACCESS(maps)->maps_by_name = maps_by_name;
+ RC_CHK_ACCESS(maps)->nr_maps_allocated = maps__nr_maps(maps);
maps__for_each_entry(maps, rb_node)
maps_by_name[i++] = map__get(rb_node->map);
@@ -2132,11 +2132,12 @@ struct map *maps__find_by_name(struct maps *maps, const char *name)
down_read(maps__lock(maps));
- if (maps->last_search_by_name) {
- const struct dso *dso = map__dso(maps->last_search_by_name);
+
+ if (RC_CHK_ACCESS(maps)->last_search_by_name) {
+ const struct dso *dso = map__dso(RC_CHK_ACCESS(maps)->last_search_by_name);
if (strcmp(dso->short_name, name) == 0) {
- map = maps->last_search_by_name;
+ map = RC_CHK_ACCESS(maps)->last_search_by_name;
goto out_unlock;
}
}
@@ -2156,7 +2157,7 @@ struct map *maps__find_by_name(struct maps *maps, const char *name)
map = rb_node->map;
dso = map__dso(map);
if (strcmp(dso->short_name, name) == 0) {
- maps->last_search_by_name = map;
+ RC_CHK_ACCESS(maps)->last_search_by_name = map;
goto out_unlock;
}
}