summaryrefslogtreecommitdiff
path: root/tools/perf/util/dsos.c
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2024-05-04 14:38:01 -0700
committerArnaldo Carvalho de Melo <acme@redhat.com>2024-05-06 15:28:49 -0300
commitee756ef7491eafd70f390343a1d90930af125a51 (patch)
treeac5e5aa5fed83cbc7db80a77e67b2045b14122de /tools/perf/util/dsos.c
parent7a9418cf7f05a74cbc9d4c750ee1bfddaa11f121 (diff)
perf dso: Add reference count checking and accessor functions
Add reference count checking to struct dso, this can help with implementing correct reference counting discipline. To avoid RC_CHK_ACCESS everywhere, add accessor functions for the variables in struct dso. The majority of the change is mechanical in nature and not easy to split up. Committer testing: 'perf test' up to this patch shows no regressions. But: util/symbol.c: In function ‘dso__load_bfd_symbols’: util/symbol.c:1683:9: error: too few arguments to function ‘dso__set_adjust_symbols’ 1683 | dso__set_adjust_symbols(dso); | ^~~~~~~~~~~~~~~~~~~~~~~ In file included from util/symbol.c:21: util/dso.h:268:20: note: declared here 268 | static inline void dso__set_adjust_symbols(struct dso *dso, bool val) | ^~~~~~~~~~~~~~~~~~~~~~~ make[6]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:106: /tmp/tmp.ZWHbQftdN6/util/symbol.o] Error 1 MKDIR /tmp/tmp.ZWHbQftdN6/tests/workloads/ make[6]: *** Waiting for unfinished jobs.... This was updated: - symbols__fixup_end(&dso->symbols, false); - symbols__fixup_duplicate(&dso->symbols); - dso->adjust_symbols = 1; + symbols__fixup_end(dso__symbols(dso), false); + symbols__fixup_duplicate(dso__symbols(dso)); + dso__set_adjust_symbols(dso); But not build tested with BUILD_NONDISTRO and libbfd devel files installed (binutils-devel on fedora). Add the missing argument: symbols__fixup_end(dso__symbols(dso), false); symbols__fixup_duplicate(dso__symbols(dso)); - dso__set_adjust_symbols(dso); + dso__set_adjust_symbols(dso, true); Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Cc: Ben Gainey <ben.gainey@arm.com> Cc: Changbin Du <changbin.du@huawei.com> Cc: Chengen Du <chengen.du@canonical.com> Cc: Colin Ian King <colin.i.king@gmail.com> Cc: Dima Kogan <dima@secretsauce.net> Cc: Ilkka Koskinen <ilkka@os.amperecomputing.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: K Prateek Nayak <kprateek.nayak@amd.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Leo Yan <leo.yan@linux.dev> Cc: Li Dong <lidong@vivo.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paran Lee <p4ranlee@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Song Liu <song@kernel.org> Cc: Sun Haiyong <sunhaiyong@loongson.cn> Cc: Thomas Richter <tmricht@linux.ibm.com> Cc: Tiezhu Yang <yangtiezhu@loongson.cn> Cc: Yanteng Si <siyanteng@loongson.cn> Cc: zhaimingbing <zhaimingbing@cmss.chinamobile.com> Link: https://lore.kernel.org/r/20240504213803.218974-6-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/dsos.c')
-rw-r--r--tools/perf/util/dsos.c54
1 files changed, 27 insertions, 27 deletions
diff --git a/tools/perf/util/dsos.c b/tools/perf/util/dsos.c
index 2e4e86dc6c17..ab3d0c01dd63 100644
--- a/tools/perf/util/dsos.c
+++ b/tools/perf/util/dsos.c
@@ -29,7 +29,7 @@ static void dsos__purge(struct dsos *dsos)
for (unsigned int i = 0; i < dsos->cnt; i++) {
struct dso *dso = dsos->dsos[i];
- dso->dsos = NULL;
+ dso__set_dsos(dso, NULL);
dso__put(dso);
}
@@ -73,22 +73,22 @@ static int dsos__read_build_ids_cb(struct dso *dso, void *data)
struct dsos__read_build_ids_cb_args *args = data;
struct nscookie nsc;
- if (args->with_hits && !dso->hit && !dso__is_vdso(dso))
+ if (args->with_hits && !dso__hit(dso) && !dso__is_vdso(dso))
return 0;
- if (dso->has_build_id) {
+ if (dso__has_build_id(dso)) {
args->have_build_id = true;
return 0;
}
- nsinfo__mountns_enter(dso->nsinfo, &nsc);
- if (filename__read_build_id(dso->long_name, &dso->bid) > 0) {
+ nsinfo__mountns_enter(dso__nsinfo(dso), &nsc);
+ if (filename__read_build_id(dso__long_name(dso), dso__bid(dso)) > 0) {
args->have_build_id = true;
- dso->has_build_id = true;
- } else if (errno == ENOENT && dso->nsinfo) {
- char *new_name = dso__filename_with_chroot(dso, dso->long_name);
+ dso__set_has_build_id(dso);
+ } else if (errno == ENOENT && dso__nsinfo(dso)) {
+ char *new_name = dso__filename_with_chroot(dso, dso__long_name(dso));
- if (new_name && filename__read_build_id(new_name, &dso->bid) > 0) {
+ if (new_name && filename__read_build_id(new_name, dso__bid(dso)) > 0) {
args->have_build_id = true;
- dso->has_build_id = true;
+ dso__set_has_build_id(dso);
}
free(new_name);
}
@@ -110,27 +110,27 @@ bool dsos__read_build_ids(struct dsos *dsos, bool with_hits)
static int __dso__cmp_long_name(const char *long_name, const struct dso_id *id,
const struct dso *b)
{
- int rc = strcmp(long_name, b->long_name);
- return rc ?: dso_id__cmp(id, &b->id);
+ int rc = strcmp(long_name, dso__long_name(b));
+ return rc ?: dso_id__cmp(id, dso__id_const(b));
}
static int __dso__cmp_short_name(const char *short_name, const struct dso_id *id,
const struct dso *b)
{
- int rc = strcmp(short_name, b->short_name);
- return rc ?: dso_id__cmp(id, &b->id);
+ int rc = strcmp(short_name, dso__short_name(b));
+ return rc ?: dso_id__cmp(id, dso__id_const(b));
}
static int dsos__cmp_long_name_id_short_name(const void *va, const void *vb)
{
const struct dso *a = *((const struct dso **)va);
const struct dso *b = *((const struct dso **)vb);
- int rc = strcmp(a->long_name, b->long_name);
+ int rc = strcmp(dso__long_name(a), dso__long_name(b));
if (!rc) {
- rc = dso_id__cmp(&a->id, &b->id);
+ rc = dso_id__cmp(dso__id_const(a), dso__id_const(b));
if (!rc)
- rc = strcmp(a->short_name, b->short_name);
+ rc = strcmp(dso__short_name(a), dso__short_name(b));
}
return rc;
}
@@ -209,7 +209,7 @@ int __dsos__add(struct dsos *dsos, struct dso *dso)
&dsos->dsos[dsos->cnt - 1])
<= 0;
}
- dso->dsos = dsos;
+ dso__set_dsos(dso, dsos);
return 0;
}
@@ -275,7 +275,7 @@ static void dso__set_basename(struct dso *dso)
char *base, *lname;
int tid;
- if (sscanf(dso->long_name, "/tmp/perf-%d.map", &tid) == 1) {
+ if (sscanf(dso__long_name(dso), "/tmp/perf-%d.map", &tid) == 1) {
if (asprintf(&base, "[JIT] tid %d", tid) < 0)
return;
} else {
@@ -283,7 +283,7 @@ static void dso__set_basename(struct dso *dso)
* basename() may modify path buffer, so we must pass
* a copy.
*/
- lname = strdup(dso->long_name);
+ lname = strdup(dso__long_name(dso));
if (!lname)
return;
@@ -322,7 +322,7 @@ static struct dso *__dsos__findnew_id(struct dsos *dsos, const char *name, struc
{
struct dso *dso = __dsos__find_id(dsos, name, id, false, /*write_locked=*/true);
- if (dso && dso_id__empty(&dso->id) && !dso_id__empty(id))
+ if (dso && dso_id__empty(dso__id(dso)) && !dso_id__empty(id))
__dso__inject_id(dso, id);
return dso ? dso : __dsos__addnew_id(dsos, name, id);
@@ -351,8 +351,8 @@ static int dsos__fprintf_buildid_cb(struct dso *dso, void *data)
if (args->skip && args->skip(dso, args->parm))
return 0;
- build_id__sprintf(&dso->bid, sbuild_id);
- args->ret += fprintf(args->fp, "%-40s %s\n", sbuild_id, dso->long_name);
+ build_id__sprintf(dso__bid(dso), sbuild_id);
+ args->ret += fprintf(args->fp, "%-40s %s\n", sbuild_id, dso__long_name(dso));
return 0;
}
@@ -396,7 +396,7 @@ size_t dsos__fprintf(struct dsos *dsos, FILE *fp)
static int dsos__hit_all_cb(struct dso *dso, void *data __maybe_unused)
{
- dso->hit = true;
+ dso__set_hit(dso);
return 0;
}
@@ -432,7 +432,7 @@ struct dso *dsos__findnew_module_dso(struct dsos *dsos,
dso__set_basename(dso);
dso__set_module_info(dso, m, machine);
dso__set_long_name(dso, strdup(filename), true);
- dso->kernel = DSO_SPACE__KERNEL;
+ dso__set_kernel(dso, DSO_SPACE__KERNEL);
__dsos__add(dsos, dso);
up_write(&dsos->lock);
@@ -455,8 +455,8 @@ static int dsos__find_kernel_dso_cb(struct dso *dso, void *data)
* Therefore, we pass PERF_RECORD_MISC_CPUMODE_UNKNOWN.
* is_kernel_module() treats it as a kernel cpumode.
*/
- if (!dso->kernel ||
- is_kernel_module(dso->long_name, PERF_RECORD_MISC_CPUMODE_UNKNOWN))
+ if (!dso__kernel(dso) ||
+ is_kernel_module(dso__long_name(dso), PERF_RECORD_MISC_CPUMODE_UNKNOWN))
return 0;
*res = dso__get(dso);