perf dso: Sort symbols under lock
authorIan Rogers <irogers@google.com>
Fri, 23 Jun 2023 05:45:18 +0000 (22:45 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Sat, 24 Jun 2023 04:44:48 +0000 (21:44 -0700)
Determine if symbols are sorted, set the sorted flag and sort under
the dso lock. Done in the interest of thread safety.

Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Carsten Haitzler <carsten.haitzler@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Jason Wang <wangborong@cdjrlc.com>
Cc: Changbin Du <changbin.du@huawei.com>
Cc: Yang Jihong <yangjihong1@huawei.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Link: https://lore.kernel.org/r/20230623054520.4118442-2-irogers@google.com
[ handle the similar code in util/probe-event.c ]
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/map.c
tools/perf/util/probe-event.c
tools/perf/util/symbol.c

index f30d34903aa4eabe77f20a94eee9a24e2b896f2f..a45708289cc63e057086d0a2172c005ec4a16ab4 100644 (file)
@@ -398,8 +398,7 @@ struct symbol *map__find_symbol_by_name(struct map *map, const char *name)
                return NULL;
 
        dso = map__dso(map);
-       if (!dso__sorted_by_name(dso))
-               dso__sort_by_name(dso);
+       dso__sort_by_name(dso);
 
        return dso__find_symbol_by_name(dso, name);
 }
index 6e2110d605fb2b11c94dd02e1537ea703fa74312..e477525f3a6b8e32684211a510095c1577eaffd5 100644 (file)
@@ -3767,8 +3767,7 @@ int show_available_funcs(const char *target, struct nsinfo *nsi,
                goto end;
        }
        dso = map__dso(map);
-       if (!dso__sorted_by_name(dso))
-               dso__sort_by_name(dso);
+       dso__sort_by_name(dso);
 
        /* Show all (filtered) symbols */
        setup_pager();
index d275d3bef7d54a40837445b36e45d14ff5d845ea..bb02047e1c59e6666b78541483dd10445c1d591d 100644 (file)
@@ -613,8 +613,12 @@ struct symbol *dso__find_symbol_by_name(struct dso *dso, const char *name)
 
 void dso__sort_by_name(struct dso *dso)
 {
-       dso__set_sorted_by_name(dso);
-       return symbols__sort_by_name(&dso->symbol_names, &dso->symbols);
+       mutex_lock(&dso->lock);
+       if (!dso__sorted_by_name(dso)) {
+               symbols__sort_by_name(&dso->symbol_names, &dso->symbols);
+               dso__set_sorted_by_name(dso);
+       }
+       mutex_unlock(&dso->lock);
 }
 
 /*