From nobody Wed Dec 17 12:44:29 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D3FA5C4167B for ; Mon, 27 Nov 2023 22:17:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233959AbjK0WRa (ORCPT ); Mon, 27 Nov 2023 17:17:30 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59846 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233953AbjK0WRH (ORCPT ); Mon, 27 Nov 2023 17:17:07 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 12F503A88 for ; Mon, 27 Nov 2023 14:11:12 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5d10f5bf5d9so10708897b3.3 for ; Mon, 27 Nov 2023 14:11:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1701123071; x=1701727871; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=5WC7vO5+D828hw0GcRHUZ0tR86g1mSv6t2NIIETnn0g=; b=n5PpPgKHdLjmNUK6YNxQ0zdiIc8f7l+h92HHwZnGZo/8VB6Agawsn+13HYRagK3LY2 yfr24mBi4I/qcgb0D53UKldW9kz50mKVSKpvXrB7sgd/f7pukbTIaQh21Ff3hX16n2FK LH+I0kbolEimHL/7i2eLqAZ3Qe8qsN5nep/+rjUnfSKLWRWIFwHTf/U8disQKbapAZBH Wv7Rp/RBwwYqRFUzXJ/VjTavRKVLJsMpaBnwpdhJ5faEcjEURWvmW1t1jZ2fqTpMoQpA 7+8gcHziNGZCNa/feMiZbpUfRPXBnkAw73cqremqk0d79+g0+jLavAW0i+bfTcD7TEB1 ABgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701123071; x=1701727871; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5WC7vO5+D828hw0GcRHUZ0tR86g1mSv6t2NIIETnn0g=; b=nWFji+p0poFUfPPh1l1qkyzvxtf8j/co26h2C4MnI3pcyRyYmWyWp06qNJVS7cusCk Ti2AmwlnfOIBykyRPdAZdFsKIAVRMN9rjB7r9XHWUZjd+3Osx8q3eb+oDnR4dAs1fNg6 aob2xGJxo7eXgkV0gCJfJ+Omn5qLvWWIby45ws0OjFwjNk/W4mdp6gjUcGBhn/gRJy3q kYJyNyK9gWhSrzY0fY0D8f78TDl/HRA5JWi0x2Dhfrhro5R6FM50b8Bjexqg7SqWEIdb 1fVWeAM3UjVHvONo4TqUV0SqfKHyZoFhPC1CALIkPOLyrUpsiiwq939hT1uuouBxJ4Qt JTJw== X-Gm-Message-State: AOJu0Yyk13SqzX6/Ih4jk2R6WOxuWiiIB/7mz5vh4e2GSspDwsZj2R/A WnHDU9j9JXubmWJGnelAUztLmQgehtR1 X-Google-Smtp-Source: AGHT+IGmt6l4UxwWP718fQfp+ddlZPbiHkkNHffaFvouym1IWJG3IadCrTsJ7IbrlzZr50PkAfIJ7aq25Sr+ X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:829:6e77:9093:f39b]) (user=irogers job=sendgmr) by 2002:a05:690c:250d:b0:5ce:3dd9:a380 with SMTP id dt13-20020a05690c250d00b005ce3dd9a380mr326548ywb.2.1701123071087; Mon, 27 Nov 2023 14:11:11 -0800 (PST) Date: Mon, 27 Nov 2023 14:08:59 -0800 In-Reply-To: <20231127220902.1315692-1-irogers@google.com> Message-Id: <20231127220902.1315692-48-irogers@google.com> Mime-Version: 1.0 References: <20231127220902.1315692-1-irogers@google.com> X-Mailer: git-send-email 2.43.0.rc1.413.gea7ed67945-goog Subject: [PATCH v5 47/50] perf dso: Add reference count checking and accessor functions From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Nick Terrell , Kan Liang , Andi Kleen , Kajol Jain , Athira Rajeev , Huacai Chen , Masami Hiramatsu , Vincent Whitchurch , "Steinar H. Gunderson" , Liam Howlett , Miguel Ojeda , Colin Ian King , Dmitrii Dolgov <9erthalion6@gmail.com>, Yang Jihong , Ming Wang , James Clark , K Prateek Nayak , Sean Christopherson , Leo Yan , Ravi Bangoria , German Gomez , Changbin Du , Paolo Bonzini , Li Dong , Sandipan Das , liuwenyu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Guilherme Amadio Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Ian Rogers --- tools/perf/builtin-annotate.c | 6 +- tools/perf/builtin-buildid-cache.c | 2 +- tools/perf/builtin-buildid-list.c | 18 +- tools/perf/builtin-inject.c | 71 ++- tools/perf/builtin-kallsyms.c | 2 +- tools/perf/builtin-mem.c | 4 +- tools/perf/builtin-report.c | 6 +- tools/perf/builtin-script.c | 8 +- tools/perf/builtin-top.c | 4 +- tools/perf/tests/code-reading.c | 8 +- tools/perf/tests/dso-data.c | 11 +- tools/perf/tests/hists_common.c | 6 +- tools/perf/tests/hists_cumulate.c | 4 +- tools/perf/tests/hists_output.c | 2 +- tools/perf/tests/maps.c | 4 +- tools/perf/tests/symbols.c | 2 +- tools/perf/tests/vmlinux-kallsyms.c | 6 +- tools/perf/ui/browsers/annotate.c | 6 +- tools/perf/ui/browsers/hists.c | 8 +- tools/perf/ui/browsers/map.c | 4 +- tools/perf/util/annotate.c | 44 +- tools/perf/util/auxtrace.c | 2 +- tools/perf/util/block-info.c | 2 +- tools/perf/util/bpf-event.c | 8 +- tools/perf/util/build-id.c | 38 +- tools/perf/util/callchain.c | 2 +- tools/perf/util/data-convert-json.c | 2 +- tools/perf/util/db-export.c | 6 +- tools/perf/util/dlfilter.c | 12 +- tools/perf/util/dso.c | 364 ++++++------- tools/perf/util/dso.h | 478 ++++++++++++++++-- tools/perf/util/dsos.c | 54 +- tools/perf/util/event.c | 8 +- tools/perf/util/header.c | 8 +- tools/perf/util/hist.c | 4 +- tools/perf/util/intel-pt.c | 22 +- tools/perf/util/machine.c | 46 +- tools/perf/util/map.c | 69 ++- tools/perf/util/maps.c | 14 +- tools/perf/util/probe-event.c | 25 +- .../scripting-engines/trace-event-python.c | 21 +- tools/perf/util/sort.c | 19 +- tools/perf/util/srcline.c | 65 +-- tools/perf/util/symbol-elf.c | 92 ++-- tools/perf/util/symbol.c | 186 +++---- tools/perf/util/symbol_fprintf.c | 4 +- tools/perf/util/synthetic-events.c | 24 +- tools/perf/util/thread.c | 4 +- tools/perf/util/unwind-libunwind-local.c | 18 +- tools/perf/util/unwind-libunwind.c | 2 +- tools/perf/util/vdso.c | 8 +- 51 files changed, 1126 insertions(+), 707 deletions(-) diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index a9129b51d511..10ab9dbf8840 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -213,7 +213,7 @@ static int process_branch_callback(struct evsel *evsel, } =20 if (a.map !=3D NULL) - map__dso(a.map)->hit =3D 1; + dso__set_hit(map__dso(a.map)); =20 hist__account_cycles(sample->branch_stack, al, sample, false, NULL); =20 @@ -248,7 +248,7 @@ static int evsel__add_sample(struct evsel *evsel, struc= t perf_sample *sample, if (al->sym !=3D NULL) { struct dso *dso =3D map__dso(al->map); =20 - rb_erase_cached(&al->sym->rb_node, &dso->symbols); + rb_erase_cached(&al->sym->rb_node, dso__symbols(dso)); symbol__delete(al->sym); dso__reset_find_symbol_cache(dso); } @@ -334,7 +334,7 @@ static void hists__find_annotations(struct hists *hists, struct hist_entry *he =3D rb_entry(nd, struct hist_entry, rb_node); struct annotation *notes; =20 - if (he->ms.sym =3D=3D NULL || map__dso(he->ms.map)->annotate_warned) + if (he->ms.sym =3D=3D NULL || dso__annotate_warned(map__dso(he->ms.map))) goto find_next; =20 if (ann->sym_hist_filter && diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildi= d-cache.c index e2a40f1d9225..b0511d16aeb6 100644 --- a/tools/perf/builtin-buildid-cache.c +++ b/tools/perf/builtin-buildid-cache.c @@ -286,7 +286,7 @@ static bool dso__missing_buildid_cache(struct dso *dso,= int parm __maybe_unused) =20 pr_warning("Problems with %s file, consider removing it from the cache\n= ", filename); - } else if (memcmp(dso->bid.data, bid.data, bid.size)) { + } else if (memcmp(dso__bid(dso)->data, bid.data, bid.size)) { pr_warning("Problems with %s file, consider removing it from the cache\n= ", filename); } diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid= -list.c index c9037477865a..383d5de36ce4 100644 --- a/tools/perf/builtin-buildid-list.c +++ b/tools/perf/builtin-buildid-list.c @@ -26,16 +26,18 @@ static int buildid__map_cb(struct map *map, void *arg _= _maybe_unused) { const struct dso *dso =3D map__dso(map); char bid_buf[SBUILD_ID_SIZE]; + const char *dso_long_name =3D dso__long_name(dso); + const char *dso_short_name =3D dso__short_name(dso); =20 memset(bid_buf, 0, sizeof(bid_buf)); - if (dso->has_build_id) - build_id__sprintf(&dso->bid, bid_buf); + if (dso__has_build_id(dso)) + build_id__sprintf(dso__bid_const(dso), bid_buf); printf("%s %16" PRIx64 " %16" PRIx64, bid_buf, map__start(map), map__end(= map)); - if (dso->long_name !=3D NULL) { - printf(" %s", dso->long_name); - } else if (dso->short_name !=3D NULL) { - printf(" %s", dso->short_name); - } + if (dso_long_name !=3D NULL) + printf(" %s", dso_long_name); + else if (dso_short_name !=3D NULL) + printf(" %s", dso_short_name); + printf("\n"); =20 return 0; @@ -76,7 +78,7 @@ static int filename__fprintf_build_id(const char *name, F= ILE *fp) =20 static bool dso__skip_buildid(struct dso *dso, int with_hits) { - return with_hits && !dso->hit; + return with_hits && !dso__hit(dso); } =20 static int perf_session__list_build_ids(bool force, bool with_hits) diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index ce5e28eaad90..a212678d47be 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -445,10 +445,9 @@ static struct dso *findnew_dso(int pid, int tid, const= char *filename, } =20 if (dso) { - mutex_lock(&dso->lock); - nsinfo__put(dso->nsinfo); - dso->nsinfo =3D nsi; - mutex_unlock(&dso->lock); + mutex_lock(dso__lock(dso)); + dso__set_nsinfo(dso, nsi); + mutex_unlock(dso__lock(dso)); } else nsinfo__put(nsi); =20 @@ -466,8 +465,8 @@ static int perf_event__repipe_buildid_mmap(struct perf_= tool *tool, dso =3D findnew_dso(event->mmap.pid, event->mmap.tid, event->mmap.filename, NULL, machine); =20 - if (dso && !dso->hit) { - dso->hit =3D 1; + if (dso && !dso__hit(dso)) { + dso__set_hit(dso); dso__inject_build_id(dso, tool, machine, sample->cpumode, 0); } dso__put(dso); @@ -492,7 +491,7 @@ static int perf_event__repipe_mmap2(struct perf_tool *t= ool, event->mmap2.filename, NULL, machine); if (dso) { /* mark it not to inject build-id */ - dso->hit =3D 1; + dso__set_hit(dso); } dso__put(dso); } @@ -544,7 +543,7 @@ static int perf_event__repipe_buildid_mmap2(struct perf= _tool *tool, event->mmap2.filename, NULL, machine); if (dso) { /* mark it not to inject build-id */ - dso->hit =3D 1; + dso__set_hit(dso); } dso__put(dso); perf_event__repipe(tool, event, sample, machine); @@ -554,8 +553,8 @@ static int perf_event__repipe_buildid_mmap2(struct perf= _tool *tool, dso =3D findnew_dso(event->mmap2.pid, event->mmap2.tid, event->mmap2.filename, &dso_id, machine); =20 - if (dso && !dso->hit) { - dso->hit =3D 1; + if (dso && !dso__hit(dso)) { + dso__set_hit(dso); dso__inject_build_id(dso, tool, machine, sample->cpumode, event->mmap2.flags); } @@ -631,24 +630,24 @@ static int dso__read_build_id(struct dso *dso) { struct nscookie nsc; =20 - if (dso->has_build_id) + if (dso__has_build_id(dso)) return 0; =20 - mutex_lock(&dso->lock); - nsinfo__mountns_enter(dso->nsinfo, &nsc); - if (filename__read_build_id(dso->long_name, &dso->bid) > 0) - dso->has_build_id =3D true; - else if (dso->nsinfo) { - char *new_name =3D dso__filename_with_chroot(dso, dso->long_name); + mutex_lock(dso__lock(dso)); + nsinfo__mountns_enter(dso__nsinfo(dso), &nsc); + if (filename__read_build_id(dso__long_name(dso), dso__bid(dso)) > 0) + dso__set_has_build_id(dso); + else if (dso__nsinfo(dso)) { + char *new_name =3D dso__filename_with_chroot(dso, dso__long_name(dso)); =20 - if (new_name && filename__read_build_id(new_name, &dso->bid) > 0) - dso->has_build_id =3D true; + if (new_name && filename__read_build_id(new_name, dso__bid(dso)) > 0) + dso__set_has_build_id(dso); free(new_name); } nsinfo__mountns_exit(&nsc); - mutex_unlock(&dso->lock); + mutex_unlock(dso__lock(dso)); =20 - return dso->has_build_id ? 0 : -1; + return dso__has_build_id(dso) ? 0 : -1; } =20 static struct strlist *perf_inject__parse_known_build_ids( @@ -700,14 +699,14 @@ static bool perf_inject__lookup_known_build_id(struct= perf_inject *inject, dso_name =3D strchr(build_id, ' '); bid_len =3D dso_name - pos->s; dso_name =3D skip_spaces(dso_name); - if (strcmp(dso->long_name, dso_name)) + if (strcmp(dso__long_name(dso), dso_name)) continue; for (int ix =3D 0; 2 * ix + 1 < bid_len; ++ix) { - dso->bid.data[ix] =3D (hex(build_id[2 * ix]) << 4 | - hex(build_id[2 * ix + 1])); + dso__bid(dso)->data[ix] =3D (hex(build_id[2 * ix]) << 4 | + hex(build_id[2 * ix + 1])); } - dso->bid.size =3D bid_len / 2; - dso->has_build_id =3D 1; + dso__bid(dso)->size =3D bid_len / 2; + dso__set_has_build_id(dso); return true; } return false; @@ -720,9 +719,9 @@ static int dso__inject_build_id(struct dso *dso, struct= perf_tool *tool, tool); int err; =20 - if (is_anon_memory(dso->long_name) || flags & MAP_HUGETLB) + if (is_anon_memory(dso__long_name(dso)) || flags & MAP_HUGETLB) return 0; - if (is_no_dso_memory(dso->long_name)) + if (is_no_dso_memory(dso__long_name(dso))) return 0; =20 if (inject->known_build_ids !=3D NULL && @@ -730,14 +729,14 @@ static int dso__inject_build_id(struct dso *dso, stru= ct perf_tool *tool, return 1; =20 if (dso__read_build_id(dso) < 0) { - pr_debug("no build_id found for %s\n", dso->long_name); + pr_debug("no build_id found for %s\n", dso__long_name(dso)); return -1; } =20 err =3D perf_event__synthesize_build_id(tool, dso, cpumode, perf_event__repipe, machine); if (err) { - pr_err("Can't synthesize build_id event for %s\n", dso->long_name); + pr_err("Can't synthesize build_id event for %s\n", dso__long_name(dso)); return -1; } =20 @@ -763,8 +762,8 @@ int perf_event__inject_buildid(struct perf_tool *tool, = union perf_event *event, if (thread__find_map(thread, sample->cpumode, sample->ip, &al)) { struct dso *dso =3D map__dso(al.map); =20 - if (!dso->hit) { - dso->hit =3D 1; + if (!dso__hit(dso)) { + dso__set_hit(dso); dso__inject_build_id(dso, tool, machine, sample->cpumode, map__flags(al.map)); } @@ -1146,8 +1145,8 @@ static bool dso__is_in_kernel_space(struct dso *dso) return false; =20 return dso__is_kcore(dso) || - dso->kernel || - is_kernel_module(dso->long_name, PERF_RECORD_MISC_CPUMODE_UNKNOWN); + dso__kernel(dso) || + is_kernel_module(dso__long_name(dso), PERF_RECORD_MISC_CPUMODE_UNK= NOWN); } =20 static u64 evlist__first_id(struct evlist *evlist) @@ -1181,7 +1180,7 @@ static int synthesize_build_id(struct perf_inject *in= ject, struct dso *dso, pid_ if (!machine) return -ENOMEM; =20 - dso->hit =3D 1; + dso__set_hit(dso); =20 return perf_event__synthesize_build_id(&inject->tool, dso, cpumode, process_build_id, machine); @@ -1192,7 +1191,7 @@ static int guest_session__add_build_ids_cb(struct dso= *dso, void *data) struct guest_session *gs =3D data; struct perf_inject *inject =3D container_of(gs, struct perf_inject, guest= _session); =20 - if (!dso->has_build_id) + if (!dso__has_build_id(dso)) return 0; =20 return synthesize_build_id(inject, dso, gs->machine_pid); diff --git a/tools/perf/builtin-kallsyms.c b/tools/perf/builtin-kallsyms.c index 7f75c5b73f26..a3c2ffdc1af8 100644 --- a/tools/perf/builtin-kallsyms.c +++ b/tools/perf/builtin-kallsyms.c @@ -38,7 +38,7 @@ static int __cmd_kallsyms(int argc, const char **argv) =20 dso =3D map__dso(map); printf("%s: %s %s %#" PRIx64 "-%#" PRIx64 " (%#" PRIx64 "-%#" PRIx64")\n= ", - symbol->name, dso->short_name, dso->long_name, + symbol->name, dso__short_name(dso), dso__long_name(dso), map__unmap_ip(map, symbol->start), map__unmap_ip(map, symbol->end), symbol->start, symbol->end); } diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index 51499c20da01..7c2f16d25a71 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -213,7 +213,7 @@ dump_raw_samples(struct perf_tool *tool, if (al.map !=3D NULL) { dso =3D map__dso(al.map); if (dso) - dso->hit =3D 1; + dso__set_hit(dso); } =20 field_sep =3D symbol_conf.field_sep; @@ -255,7 +255,7 @@ dump_raw_samples(struct perf_tool *tool, symbol_conf.field_sep, sample->data_src, symbol_conf.field_sep, - dso ? dso->long_name : "???", + dso ? dso__long_name(dso) : "???", al.sym ? al.sym->name : "???"); out_put: addr_location__exit(&al); diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index f5b95d45f6da..2a2355275379 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -322,7 +322,7 @@ static int process_sample_event(struct perf_tool *tool, } =20 if (al.map !=3D NULL) - map__dso(al.map)->hit =3D 1; + dso__set_hit(map__dso(al.map)); =20 if (ui__has_annotation() || rep->symbol_ipc || rep->total_cycles_mode) { hist__account_cycles(sample->branch_stack, &al, sample, @@ -611,7 +611,7 @@ static void report__warn_kptr_restrict(const struct rep= ort *rep) return; =20 if (kernel_map =3D=3D NULL || - (map__dso(kernel_map)->hit && + (dso__hit(map__dso(kernel_map)) && (kernel_kmap->ref_reloc_sym =3D=3D NULL || kernel_kmap->ref_reloc_sym->addr =3D=3D 0))) { const char *desc =3D @@ -852,7 +852,7 @@ static int maps__fprintf_task_cb(struct map *map, void = *data) prot & PROT_EXEC ? 'x' : '-', map__flags(map) ? 's' : 'p', map__pgoff(map), - dso->id.ino, dso->name); + dso__id_const(dso)->ino, dso__name(dso)); =20 if (ret < 0) return ret; diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index b1f57401ff23..e31333c5ebd2 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -1011,11 +1011,11 @@ static int perf_sample__fprintf_brstackoff(struct p= erf_sample *sample, to =3D entries[i].to; =20 if (thread__find_map_fb(thread, sample->cpumode, from, &alf) && - !map__dso(alf.map)->adjust_symbols) + !dso__adjust_symbols(map__dso(alf.map))) from =3D map__dso_map_ip(alf.map, from); =20 if (thread__find_map_fb(thread, sample->cpumode, to, &alt) && - !map__dso(alt.map)->adjust_symbols) + !dso__adjust_symbols(map__dso(alt.map))) to =3D map__dso_map_ip(alt.map, to); =20 printed +=3D fprintf(fp, " 0x%"PRIx64, from); @@ -1076,7 +1076,7 @@ static int grab_bb(u8 *buffer, u64 start, u64 end, pr_debug("\tcannot resolve %" PRIx64 "-%" PRIx64 "\n", start, end); goto out; } - if (dso->data.status =3D=3D DSO_DATA_STATUS_ERROR) { + if (dso__data(dso)->status =3D=3D DSO_DATA_STATUS_ERROR) { pr_debug("\tcannot resolve %" PRIx64 "-%" PRIx64 "\n", start, end); goto out; } @@ -1088,7 +1088,7 @@ static int grab_bb(u8 *buffer, u64 start, u64 end, len =3D dso__data_read_offset(dso, machine, offset, (u8 *)buffer, end - start + MAXINSN); =20 - *is64bit =3D dso->is_64_bit; + *is64bit =3D dso__is_64_bit(dso); if (len <=3D 0) pr_debug("\tcannot fetch code for block at %" PRIx64 "-%" PRIx64 "\n", start, end); diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index ea8c7eca5eee..71c48cf22789 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -129,7 +129,7 @@ static int perf_top__parse_source(struct perf_top *top,= struct hist_entry *he) /* * We can't annotate with just /proc/kallsyms */ - if (dso->symtab_type =3D=3D DSO_BINARY_TYPE__KALLSYMS && !dso__is_kcore(d= so)) { + if (dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__KALLSYMS && !dso__is_kc= ore(dso)) { pr_err("Can't annotate %s: No vmlinux file was found in the " "path\n", sym->name); sleep(1); @@ -182,7 +182,7 @@ static void ui__warn_map_erange(struct map *map, struct= symbol *sym, u64 ip) "Tools: %s\n\n" "Not all samples will be on the annotation output.\n\n" "Please report to linux-kernel@vger.kernel.org\n", - ip, dso->long_name, dso__symtab_origin(dso), + ip, dso__long_name(dso), dso__symtab_origin(dso), map__start(map), map__end(map), sym->start, sym->end, sym->binding =3D=3D STB_GLOBAL ? 'g' : sym->binding =3D=3D STB_LOCAL ? 'l' : 'w', sym->name, diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-readin= g.c index 8620146d0378..39e7b1289c8b 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c @@ -253,9 +253,9 @@ static int read_object_code(u64 addr, size_t len, u8 cp= umode, goto out; } dso =3D map__dso(al.map); - pr_debug("File is: %s\n", dso->long_name); + pr_debug("File is: %s\n", dso__long_name(dso)); =20 - if (dso->symtab_type =3D=3D DSO_BINARY_TYPE__KALLSYMS && !dso__is_kcore(d= so)) { + if (dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__KALLSYMS && !dso__is_kc= ore(dso)) { pr_debug("Unexpected kernel address - skipping\n"); goto out; } @@ -274,7 +274,7 @@ static int read_object_code(u64 addr, size_t len, u8 cp= umode, * modules to manage long jumps. Check if the ip offset falls in stubs * sections for kernel modules. And skip module address after text end */ - if (dso->is_kmod && al.addr > dso->text_end) { + if (dso__is_kmod(dso) && al.addr > dso__text_end(dso)) { pr_debug("skipping the module address %#"PRIx64" after text end\n", al.a= ddr); goto out; } @@ -315,7 +315,7 @@ static int read_object_code(u64 addr, size_t len, u8 cp= umode, state->done[state->done_cnt++] =3D map__start(al.map); } =20 - objdump_name =3D dso->long_name; + objdump_name =3D dso__long_name(dso); if (dso__needs_decompress(dso)) { if (dso__decompress_kmodule_path(dso, objdump_name, decomp_name, diff --git a/tools/perf/tests/dso-data.c b/tools/perf/tests/dso-data.c index 3419a4ab5590..625dbb2ffe8a 100644 --- a/tools/perf/tests/dso-data.c +++ b/tools/perf/tests/dso-data.c @@ -228,7 +228,8 @@ static void dsos__delete(int cnt) for (i =3D 0; i < cnt; i++) { struct dso *dso =3D dsos[i]; =20 - unlink(dso->name); + dso__data_close(dso); + unlink(dso__name(dso)); dso__put(dso); } =20 @@ -289,14 +290,14 @@ static int test__dso_data_cache(struct test_suite *te= st __maybe_unused, int subt } =20 /* verify the first one is already open */ - TEST_ASSERT_VAL("dsos[0] is not open", dsos[0]->data.fd !=3D -1); + TEST_ASSERT_VAL("dsos[0] is not open", dso__data(dsos[0])->fd !=3D -1); =20 /* open +1 dso to reach the allowed limit */ fd =3D dso__data_fd(dsos[i], &machine); TEST_ASSERT_VAL("failed to get fd", fd > 0); =20 /* should force the first one to be closed */ - TEST_ASSERT_VAL("failed to close dsos[0]", dsos[0]->data.fd =3D=3D -1); + TEST_ASSERT_VAL("failed to close dsos[0]", dso__data(dsos[0])->fd =3D=3D = -1); =20 /* cleanup everything */ dsos__delete(dso_cnt); @@ -371,7 +372,7 @@ static int test__dso_data_reopen(struct test_suite *tes= t __maybe_unused, int sub * dso_0 should get closed, because we reached * the file descriptor limit */ - TEST_ASSERT_VAL("failed to close dso_0", dso_0->data.fd =3D=3D -1); + TEST_ASSERT_VAL("failed to close dso_0", dso__data(dso_0)->fd =3D=3D -1); =20 /* open dso_0 */ fd =3D dso__data_fd(dso_0, &machine); @@ -381,7 +382,7 @@ static int test__dso_data_reopen(struct test_suite *tes= t __maybe_unused, int sub * dso_1 should get closed, because we reached * the file descriptor limit */ - TEST_ASSERT_VAL("failed to close dso_1", dso_1->data.fd =3D=3D -1); + TEST_ASSERT_VAL("failed to close dso_1", dso__data(dso_1)->fd =3D=3D -1); =20 /* cleanup everything */ close(fd_extra); diff --git a/tools/perf/tests/hists_common.c b/tools/perf/tests/hists_commo= n.c index d08add0f4da6..187f12f5bc21 100644 --- a/tools/perf/tests/hists_common.c +++ b/tools/perf/tests/hists_common.c @@ -146,7 +146,7 @@ struct machine *setup_fake_machine(struct machines *mac= hines) goto out; } =20 - symbols__insert(&dso->symbols, sym); + symbols__insert(dso__symbols(dso), sym); } =20 dso__put(dso); @@ -183,7 +183,7 @@ void print_hists_in(struct hists *hists) =20 pr_info("%2d: entry: %-8s [%-8s] %20s: period =3D %"PRIu64"\n", i, thread__comm_str(he->thread), - dso->short_name, + dso__short_name(dso), he->ms.sym->name, he->stat.period); } =20 @@ -212,7 +212,7 @@ void print_hists_out(struct hists *hists) =20 pr_info("%2d: entry: %8s:%5d [%-8s] %20s: period =3D %"PRIu64"/%"PRIu64= "\n", i, thread__comm_str(he->thread), thread__tid(he->thread), - dso->short_name, + dso__short_name(dso), he->ms.sym->name, he->stat.period, he->stat_acc ? he->stat_acc->period : 0); } diff --git a/tools/perf/tests/hists_cumulate.c b/tools/perf/tests/hists_cum= ulate.c index 71dacb0fec4d..1e0f5a310fd5 100644 --- a/tools/perf/tests/hists_cumulate.c +++ b/tools/perf/tests/hists_cumulate.c @@ -164,11 +164,11 @@ static void put_fake_samples(void) typedef int (*test_fn_t)(struct evsel *, struct machine *); =20 #define COMM(he) (thread__comm_str(he->thread)) -#define DSO(he) (map__dso(he->ms.map)->short_name) +#define DSO(he) (dso__short_name(map__dso(he->ms.map))) #define SYM(he) (he->ms.sym->name) #define CPU(he) (he->cpu) #define DEPTH(he) (he->callchain->max_depth) -#define CDSO(cl) (map__dso(cl->ms.map)->short_name) +#define CDSO(cl) (dso__short_name(map__dso(cl->ms.map))) #define CSYM(cl) (cl->ms.sym->name) =20 struct result { diff --git a/tools/perf/tests/hists_output.c b/tools/perf/tests/hists_outpu= t.c index ba1cccf57049..33b5cc8352a7 100644 --- a/tools/perf/tests/hists_output.c +++ b/tools/perf/tests/hists_output.c @@ -129,7 +129,7 @@ static void put_fake_samples(void) typedef int (*test_fn_t)(struct evsel *, struct machine *); =20 #define COMM(he) (thread__comm_str(he->thread)) -#define DSO(he) (map__dso(he->ms.map)->short_name) +#define DSO(he) (dso__short_name(map__dso(he->ms.map))) #define SYM(he) (he->ms.sym->name) #define CPU(he) (he->cpu) #define PID(he) (thread__tid(he->thread)) diff --git a/tools/perf/tests/maps.c b/tools/perf/tests/maps.c index b15417a0d617..4f1f9385ea9c 100644 --- a/tools/perf/tests/maps.c +++ b/tools/perf/tests/maps.c @@ -26,7 +26,7 @@ static int check_maps_cb(struct map *map, void *data) =20 if (map__start(map) !=3D merged->start || map__end(map) !=3D merged->end || - strcmp(map__dso(map)->name, merged->name) || + strcmp(dso__name(map__dso(map)), merged->name) || refcount_read(map__refcnt(map)) !=3D 1) { return 1; } @@ -39,7 +39,7 @@ static int failed_cb(struct map *map, void *data __maybe_= unused) pr_debug("\tstart: %" PRIu64 " end: %" PRIu64 " name: '%s' refcnt: %d\n", map__start(map), map__end(map), - map__dso(map)->name, + dso__name(map__dso(map)), refcount_read(map__refcnt(map))); =20 return 0; diff --git a/tools/perf/tests/symbols.c b/tools/perf/tests/symbols.c index 16e1c5502b09..4bcb277b0cac 100644 --- a/tools/perf/tests/symbols.c +++ b/tools/perf/tests/symbols.c @@ -72,7 +72,7 @@ static int test_dso(struct dso *dso) if (verbose > 1) dso__fprintf(dso, stderr); =20 - for (nd =3D rb_first_cached(&dso->symbols); nd; nd =3D rb_next(nd)) { + for (nd =3D rb_first_cached(dso__symbols(dso)); nd; nd =3D rb_next(nd)) { struct symbol *sym =3D rb_entry(nd, struct symbol, rb_node); =20 if (sym->type !=3D STT_FUNC && sym->type !=3D STT_GNU_IFUNC) diff --git a/tools/perf/tests/vmlinux-kallsyms.c b/tools/perf/tests/vmlinux= -kallsyms.c index fecbf851bb2e..e30fd55f8e51 100644 --- a/tools/perf/tests/vmlinux-kallsyms.c +++ b/tools/perf/tests/vmlinux-kallsyms.c @@ -129,7 +129,7 @@ static int test__vmlinux_matches_kallsyms_cb1(struct ma= p *map, void *data) * cases. */ struct map *pair =3D maps__find_by_name(args->kallsyms.kmaps, - (dso->kernel ? dso->short_name : dso->name)); + (dso__kernel(dso) ? dso__short_name(dso) : dso__name(dso))); =20 if (pair) { map__set_priv(pair, 1); @@ -162,11 +162,11 @@ static int test__vmlinux_matches_kallsyms_cb2(struct = map *map, void *data) } =20 pr_info("WARN: %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s in kallsyms as", - map__start(map), map__end(map), map__pgoff(map), dso->name); + map__start(map), map__end(map), map__pgoff(map), dso__name(dso)); if (mem_end !=3D map__end(pair)) pr_info(":\nWARN: *%" PRIx64 "-%" PRIx64 " %" PRIx64, map__start(pair), map__end(pair), map__pgoff(pair)); - pr_info(" %s\n", dso->name); + pr_info(" %s\n", dso__name(dso)); map__set_priv(pair, 1); } map__put(pair); diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/ann= otate.c index 163f916fff68..ad4693b87941 100644 --- a/tools/perf/ui/browsers/annotate.c +++ b/tools/perf/ui/browsers/annotate.c @@ -442,7 +442,7 @@ static int sym_title(struct symbol *sym, struct map *ma= p, char *title, size_t sz, int percent_type) { return snprintf(title, sz, "%s %s [Percent: %s]", sym->name, - map__dso(map)->long_name, + dso__long_name(map__dso(map)), percent_type_str(percent_type)); } =20 @@ -975,14 +975,14 @@ int symbol__tui_annotate(struct map_symbol *ms, struc= t evsel *evsel, return -1; =20 dso =3D map__dso(ms->map); - if (dso->annotate_warned) + if (dso__annotate_warned(dso)) return -1; =20 if (not_annotated) { err =3D symbol__annotate2(ms, evsel, opts, &browser.arch); if (err) { char msg[BUFSIZ]; - dso->annotate_warned =3D true; + dso__set_annotate_warned(dso); symbol__strerror_disassemble(ms, err, msg, sizeof(msg)); ui__error("Couldn't annotate %s:\n%s", sym->name, msg); goto out_free_offsets; diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index f4812b226818..95d901b788c2 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -2491,7 +2491,7 @@ add_annotate_opt(struct hist_browser *browser __maybe= _unused, { struct dso *dso; =20 - if (!ms->map || (dso =3D map__dso(ms->map)) =3D=3D NULL || dso->annotate_= warned) + if (!ms->map || (dso =3D map__dso(ms->map)) =3D=3D NULL || dso__annotate_= warned(dso)) return 0; =20 if (!ms->sym) @@ -2584,7 +2584,7 @@ static int hists_browser__zoom_map(struct hist_browse= r *browser, struct map *map } else { struct dso *dso =3D map__dso(map); ui_helpline__fpush("To zoom out press ESC or ENTER + \"Zoom out of %s DS= O\"", - __map__is_kernel(map) ? "the Kernel" : dso->short_name); + __map__is_kernel(map) ? "the Kernel" : dso__short_name(dso)); browser->hists->dso_filter =3D dso; perf_hpp__set_elide(HISTC_DSO, true); pstack__push(browser->pstack, &browser->hists->dso_filter); @@ -2610,7 +2610,7 @@ add_dso_opt(struct hist_browser *browser, struct popu= p_action *act, =20 if (asprintf(optstr, "Zoom %s %s DSO (use the 'k' hotkey to zoom directly= into the kernel)", browser->hists->dso_filter ? "out of" : "into", - __map__is_kernel(map) ? "the Kernel" : map__dso(map)->short_name) <= 0) + __map__is_kernel(map) ? "the Kernel" : dso__short_name(map__dso(map= ))) < 0) return 0; =20 act->ms.map =3D map; @@ -3086,7 +3086,7 @@ static int evsel__hists_browse(struct evsel *evsel, i= nt nr_events, const char *h if (!browser->selection || !browser->selection->map || !map__dso(browser->selection->map) || - map__dso(browser->selection->map)->annotate_warned) { + dso__annotate_warned(map__dso(browser->selection->map))) { continue; } =20 diff --git a/tools/perf/ui/browsers/map.c b/tools/perf/ui/browsers/map.c index 3d1b958d8832..fba55175a935 100644 --- a/tools/perf/ui/browsers/map.c +++ b/tools/perf/ui/browsers/map.c @@ -76,7 +76,7 @@ static int map_browser__run(struct map_browser *browser) { int key; =20 - if (ui_browser__show(&browser->b, map__dso(browser->map)->long_name, + if (ui_browser__show(&browser->b, dso__long_name(map__dso(browser->map)), "Press ESC to exit, %s / to search", verbose > 0 ? "" : "restart with -v to use") < 0) return -1; @@ -106,7 +106,7 @@ int map__browse(struct map *map) { struct map_browser mb =3D { .b =3D { - .entries =3D &map__dso(map)->symbols, + .entries =3D dso__symbols(map__dso(map)), .refresh =3D ui_browser__rb_tree_refresh, .seek =3D ui_browser__rb_tree_seek, .write =3D map_browser__write, diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 3364edf30f50..02f435375281 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -1735,8 +1735,8 @@ int symbol__strerror_disassemble(struct map_symbol *m= s, int errnum, char *buf, s char bf[SBUILD_ID_SIZE + 15] =3D " with build id "; char *build_id_msg =3D NULL; =20 - if (dso->has_build_id) { - build_id__sprintf(&dso->bid, bf + 15); + if (dso__has_build_id(dso)) { + build_id__sprintf(dso__bid(dso), bf + 15); build_id_msg =3D bf; } scnprintf(buf, buflen, @@ -1758,11 +1758,11 @@ int symbol__strerror_disassemble(struct map_symbol = *ms, int errnum, char *buf, s scnprintf(buf, buflen, "Problems while parsing the CPUID in the arch spe= cific initialization."); break; case SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE: - scnprintf(buf, buflen, "Invalid BPF file: %s.", dso->long_name); + scnprintf(buf, buflen, "Invalid BPF file: %s.", dso__long_name(dso)); break; case SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF: scnprintf(buf, buflen, "The %s BPF file has no BTF section, compile with= -g or use pahole -J.", - dso->long_name); + dso__long_name(dso)); break; default: scnprintf(buf, buflen, "Internal error: Invalid %d error code\n", errnum= ); @@ -1780,7 +1780,7 @@ static int dso__disassemble_filename(struct dso *dso,= char *filename, size_t fil char *pos; int len; =20 - if (dso->symtab_type =3D=3D DSO_BINARY_TYPE__KALLSYMS && + if (dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__KALLSYMS && !dso__is_kcore(dso)) return SYMBOL_ANNOTATE_ERRNO__NO_VMLINUX; =20 @@ -1789,7 +1789,7 @@ static int dso__disassemble_filename(struct dso *dso,= char *filename, size_t fil __symbol__join_symfs(filename, filename_size, build_id_filename); free(build_id_filename); } else { - if (dso->has_build_id) + if (dso__has_build_id(dso)) return ENOMEM; goto fallback; } @@ -1823,20 +1823,20 @@ static int dso__disassemble_filename(struct dso *ds= o, char *filename, size_t fil * cache, or is just a kallsyms file, well, lets hope that this * DSO is the same as when 'perf record' ran. */ - if (dso->kernel && dso->long_name[0] =3D=3D '/') - snprintf(filename, filename_size, "%s", dso->long_name); + if (dso__kernel(dso) && dso__long_name(dso)[0] =3D=3D '/') + snprintf(filename, filename_size, "%s", dso__long_name(dso)); else - __symbol__join_symfs(filename, filename_size, dso->long_name); + __symbol__join_symfs(filename, filename_size, dso__long_name(dso)); =20 - mutex_lock(&dso->lock); - if (access(filename, R_OK) && errno =3D=3D ENOENT && dso->nsinfo) { + mutex_lock(dso__lock(dso)); + if (access(filename, R_OK) && errno =3D=3D ENOENT && dso__nsinfo(dso)) { char *new_name =3D dso__filename_with_chroot(dso, filename); if (new_name) { strlcpy(filename, new_name, filename_size); free(new_name); } } - mutex_unlock(&dso->lock); + mutex_unlock(dso__lock(dso)); } =20 free(build_id_path); @@ -2123,11 +2123,11 @@ static int symbol__disassemble(struct symbol *sym, = struct annotate_args *args) map__unmap_ip(map, sym->end)); =20 pr_debug("annotating [%p] %30s : [%p] %30s\n", - dso, dso->long_name, sym, sym->name); + dso, dso__long_name(dso), sym, sym->name); =20 - if (dso->binary_type =3D=3D DSO_BINARY_TYPE__BPF_PROG_INFO) { + if (dso__binary_type(dso) =3D=3D DSO_BINARY_TYPE__BPF_PROG_INFO) { return symbol__disassemble_bpf(sym, args); - } else if (dso->binary_type =3D=3D DSO_BINARY_TYPE__BPF_IMAGE) { + } else if (dso__binary_type(dso) =3D=3D DSO_BINARY_TYPE__BPF_IMAGE) { return symbol__disassemble_bpf_image(sym, args); } else if (dso__is_kcore(dso)) { kce.kcore_filename =3D symfs_filename; @@ -2555,7 +2555,7 @@ int symbol__annotate_printf(struct map_symbol *ms, st= ruct evsel *evsel, int graph_dotted_len; char buf[512]; =20 - filename =3D strdup(dso->long_name); + filename =3D strdup(dso__long_name(dso)); if (!filename) return -ENOMEM; =20 @@ -2722,7 +2722,7 @@ int map_symbol__annotation_dump(struct map_symbol *ms= , struct evsel *evsel, } =20 fprintf(fp, "%s() %s\nEvent: %s\n\n", - ms->sym->name, map__dso(ms->map)->long_name, ev_name); + ms->sym->name, dso__long_name(map__dso(ms->map)), ev_name); symbol__annotate_fprintf2(ms->sym, fp, opts); =20 fclose(fp); @@ -2979,7 +2979,7 @@ int symbol__tty_annotate2(struct map_symbol *ms, stru= ct evsel *evsel, if (err) { char msg[BUFSIZ]; =20 - dso->annotate_warned =3D true; + dso__set_annotate_warned(dso); symbol__strerror_disassemble(ms, err, msg, sizeof(msg)); ui__error("Couldn't annotate %s:\n%s", sym->name, msg); return -1; @@ -2988,12 +2988,12 @@ int symbol__tty_annotate2(struct map_symbol *ms, st= ruct evsel *evsel, if (opts->print_lines) { srcline_full_filename =3D opts->full_path; symbol__calc_lines(ms, &source_line, opts); - print_summary(&source_line, dso->long_name); + print_summary(&source_line, dso__long_name(dso)); } =20 hists__scnprintf_title(hists, buf, sizeof(buf)); fprintf(stdout, "%s, [percent: %s]\n%s() %s\n", - buf, percent_type_str(opts->percent_type), sym->name, dso->long_name); + buf, percent_type_str(opts->percent_type), sym->name, dso__long_name(dso= )); symbol__annotate_fprintf2(sym, stdout, opts); =20 annotated_source__purge(symbol__annotation(sym)->src); @@ -3013,7 +3013,7 @@ int symbol__tty_annotate(struct map_symbol *ms, struc= t evsel *evsel, if (err) { char msg[BUFSIZ]; =20 - dso->annotate_warned =3D true; + dso__set_annotate_warned(dso); symbol__strerror_disassemble(ms, err, msg, sizeof(msg)); ui__error("Couldn't annotate %s:\n%s", sym->name, msg); return -1; @@ -3024,7 +3024,7 @@ int symbol__tty_annotate(struct map_symbol *ms, struc= t evsel *evsel, if (opts->print_lines) { srcline_full_filename =3D opts->full_path; symbol__calc_lines(ms, &source_line, opts); - print_summary(&source_line, dso->long_name); + print_summary(&source_line, dso__long_name(dso)); } =20 symbol__annotate_printf(ms, evsel, opts); diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c index f528c4364d23..fe1250629d74 100644 --- a/tools/perf/util/auxtrace.c +++ b/tools/perf/util/auxtrace.c @@ -2652,7 +2652,7 @@ static int addr_filter__entire_dso(struct addr_filter= *filt, struct dso *dso) } =20 filt->addr =3D 0; - filt->size =3D dso->data.file_size; + filt->size =3D dso__data(dso)->file_size; =20 return 0; } diff --git a/tools/perf/util/block-info.c b/tools/perf/util/block-info.c index 08f82c1f166c..4cb5bdc53ac6 100644 --- a/tools/perf/util/block-info.c +++ b/tools/perf/util/block-info.c @@ -319,7 +319,7 @@ static int block_dso_entry(struct perf_hpp_fmt *fmt, st= ruct perf_hpp *hpp, =20 if (map && map__dso(map)) { return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width, - map__dso(map)->short_name); + dso__short_name(map__dso(map))); } =20 return scnprintf(hpp->buf, hpp->size, "%*s", block_fmt->width, diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c index d07fd5ffa823..b564d6fd078a 100644 --- a/tools/perf/util/bpf-event.c +++ b/tools/perf/util/bpf-event.c @@ -59,10 +59,10 @@ static int machine__process_bpf_event_load(struct machi= ne *machine, if (map) { struct dso *dso =3D map__dso(map); =20 - dso->binary_type =3D DSO_BINARY_TYPE__BPF_PROG_INFO; - dso->bpf_prog.id =3D id; - dso->bpf_prog.sub_id =3D i; - dso->bpf_prog.env =3D env; + dso__set_binary_type(dso, DSO_BINARY_TYPE__BPF_PROG_INFO); + dso__bpf_prog(dso)->id =3D id; + dso__bpf_prog(dso)->sub_id =3D i; + dso__bpf_prog(dso)->env =3D env; map__put(map); } } diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index 864bc26b6b46..83a1581e8cf1 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -60,7 +60,7 @@ int build_id__mark_dso_hit(struct perf_tool *tool __maybe= _unused, =20 addr_location__init(&al); if (thread__find_map(thread, sample->cpumode, sample->ip, &al)) - map__dso(al.map)->hit =3D 1; + dso__set_hit(map__dso(al.map)); =20 addr_location__exit(&al); thread__put(thread); @@ -272,10 +272,10 @@ char *__dso__build_id_filename(const struct dso *dso,= char *bf, size_t size, bool alloc =3D (bf =3D=3D NULL); int ret; =20 - if (!dso->has_build_id) + if (!dso__has_build_id(dso)) return NULL; =20 - build_id__sprintf(&dso->bid, sbuild_id); + build_id__sprintf(dso__bid_const(dso), sbuild_id); linkname =3D build_id_cache__linkname(sbuild_id, NULL, 0); if (!linkname) return NULL; @@ -340,25 +340,25 @@ static int machine__write_buildid_table_cb(struct dso= *dso, void *data) size_t name_len; bool in_kernel =3D false; =20 - if (!dso->has_build_id) + if (!dso__has_build_id(dso)) return 0; =20 - if (!dso->hit && !dso__is_vdso(dso)) + if (!dso__hit(dso) && !dso__is_vdso(dso)) return 0; =20 if (dso__is_vdso(dso)) { - name =3D dso->short_name; - name_len =3D dso->short_name_len; + name =3D dso__short_name(dso); + name_len =3D dso__short_name_len(dso); } else if (dso__is_kcore(dso)) { name =3D args->machine->mmap_name; name_len =3D strlen(name); } else { - name =3D dso->long_name; - name_len =3D dso->long_name_len; + name =3D dso__long_name(dso); + name_len =3D dso__long_name_len(dso); } =20 - in_kernel =3D dso->kernel || is_kernel_module(name, PERF_RECORD_MISC_CPUM= ODE_UNKNOWN); - return write_buildid(name, name_len, &dso->bid, args->machine->pid, + in_kernel =3D dso__kernel(dso) || is_kernel_module(name, PERF_RECORD_MISC= _CPUMODE_UNKNOWN); + return write_buildid(name, name_len, dso__bid(dso), args->machine->pid, in_kernel ? args->kmisc : args->umisc, args->fd); } =20 @@ -876,11 +876,11 @@ static bool dso__build_id_mismatch(struct dso *dso, c= onst char *name) struct build_id bid; bool ret =3D false; =20 - mutex_lock(&dso->lock); - if (filename__read_build_id_ns(name, &bid, dso->nsinfo) >=3D 0) + mutex_lock(dso__lock(dso)); + if (filename__read_build_id_ns(name, &bid, dso__nsinfo(dso)) >=3D 0) ret =3D !dso__build_id_equal(dso, &bid); =20 - mutex_unlock(&dso->lock); + mutex_unlock(dso__lock(dso)); =20 return ret; } @@ -890,13 +890,13 @@ static int dso__cache_build_id(struct dso *dso, struc= t machine *machine, { bool is_kallsyms =3D dso__is_kallsyms(dso); bool is_vdso =3D dso__is_vdso(dso); - const char *name =3D dso->long_name; + const char *name =3D dso__long_name(dso); const char *proper_name =3D NULL; const char *root_dir =3D NULL; char *allocated_name =3D NULL; int ret =3D 0; =20 - if (!dso->has_build_id) + if (!dso__has_build_id(dso)) return 0; =20 if (dso__is_kcore(dso)) { @@ -921,10 +921,10 @@ static int dso__cache_build_id(struct dso *dso, struc= t machine *machine, if (!is_kallsyms && dso__build_id_mismatch(dso, name)) goto out_free; =20 - mutex_lock(&dso->lock); - ret =3D build_id_cache__add_b(&dso->bid, name, dso->nsinfo, + mutex_lock(dso__lock(dso)); + ret =3D build_id_cache__add_b(dso__bid(dso), name, dso__nsinfo(dso), is_kallsyms, is_vdso, proper_name, root_dir); - mutex_unlock(&dso->lock); + mutex_unlock(dso__lock(dso)); out_free: free(allocated_name); return ret; diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index 7517d16c02ec..68feed871809 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c @@ -1205,7 +1205,7 @@ char *callchain_list__sym_name(struct callchain_list = *cl, if (show_dso) scnprintf(bf + printed, bfsize - printed, " %s", cl->ms.map ? - map__dso(cl->ms.map)->short_name : + dso__short_name(map__dso(cl->ms.map)) : "unknown"); =20 return bf; diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-con= vert-json.c index 5bb3c2ba95ca..86ef936e2e04 100644 --- a/tools/perf/util/data-convert-json.c +++ b/tools/perf/util/data-convert-json.c @@ -134,7 +134,7 @@ static void output_sample_callchain_entry(struct perf_t= ool *tool, output_json_key_string(out, false, 5, "symbol", al->sym->name); =20 if (dso) { - const char *dso_name =3D dso->short_name; + const char *dso_name =3D dso__short_name(dso); =20 if (dso_name && strlen(dso_name) > 0) { fputc(',', out); diff --git a/tools/perf/util/db-export.c b/tools/perf/util/db-export.c index b9fb71ab7a73..2fe3143e6689 100644 --- a/tools/perf/util/db-export.c +++ b/tools/perf/util/db-export.c @@ -146,10 +146,10 @@ int db_export__comm_thread(struct db_export *dbe, str= uct comm *comm, int db_export__dso(struct db_export *dbe, struct dso *dso, struct machine *machine) { - if (dso->db_id) + if (dso__db_id(dso)) return 0; =20 - dso->db_id =3D ++dbe->dso_last_db_id; + dso__set_db_id(dso, ++dbe->dso_last_db_id); =20 if (dbe->export_dso) return dbe->export_dso(dbe, dso, machine); @@ -184,7 +184,7 @@ static int db_ids_from_al(struct db_export *dbe, struct= addr_location *al, err =3D db_export__dso(dbe, dso, maps__machine(al->maps)); if (err) return err; - *dso_db_id =3D dso->db_id; + *dso_db_id =3D dso__db_id(dso); =20 if (!al->sym) { al->sym =3D symbol__new(al->addr, 0, 0, 0, "unknown"); diff --git a/tools/perf/util/dlfilter.c b/tools/perf/util/dlfilter.c index 908e16813722..7d180bdaedbc 100644 --- a/tools/perf/util/dlfilter.c +++ b/tools/perf/util/dlfilter.c @@ -33,13 +33,13 @@ static void al_to_d_al(struct addr_location *al, struct= perf_dlfilter_al *d_al) if (al->map) { struct dso *dso =3D map__dso(al->map); =20 - if (symbol_conf.show_kernel_path && dso->long_name) - d_al->dso =3D dso->long_name; + if (symbol_conf.show_kernel_path && dso__long_name(dso)) + d_al->dso =3D dso__long_name(dso); else - d_al->dso =3D dso->name; - d_al->is_64_bit =3D dso->is_64_bit; - d_al->buildid_size =3D dso->bid.size; - d_al->buildid =3D dso->bid.data; + d_al->dso =3D dso__name(dso); + d_al->is_64_bit =3D dso__is_64_bit(dso); + d_al->buildid_size =3D dso__bid(dso)->size; + d_al->buildid =3D dso__bid(dso)->data; } else { d_al->dso =3D NULL; d_al->is_64_bit =3D 0; diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 66dc929443ba..0fef597725c7 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -39,6 +39,12 @@ static const char * const debuglink_paths[] =3D { "/usr/lib/debug%s/%s" }; =20 +void dso__set_nsinfo(struct dso *dso, struct nsinfo *nsi) +{ + nsinfo__put(RC_CHK_ACCESS(dso)->nsinfo); + RC_CHK_ACCESS(dso)->nsinfo =3D nsi; +} + char dso__symtab_origin(const struct dso *dso) { static const char origin[] =3D { @@ -62,14 +68,14 @@ char dso__symtab_origin(const struct dso *dso) [DSO_BINARY_TYPE__GUEST_VMLINUX] =3D 'V', }; =20 - if (dso =3D=3D NULL || dso->symtab_type =3D=3D DSO_BINARY_TYPE__NOT_FOUND) + if (dso =3D=3D NULL || dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__NOT_= FOUND) return '!'; - return origin[dso->symtab_type]; + return origin[dso__symtab_type(dso)]; } =20 bool dso__is_object_file(const struct dso *dso) { - switch (dso->binary_type) { + switch (dso__binary_type(dso)) { case DSO_BINARY_TYPE__KALLSYMS: case DSO_BINARY_TYPE__GUEST_KALLSYMS: case DSO_BINARY_TYPE__JAVA_JIT: @@ -116,7 +122,7 @@ int dso__read_binary_type_filename(const struct dso *ds= o, char symfile[PATH_MAX]; unsigned int i; =20 - len =3D __symbol__join_symfs(filename, size, dso->long_name); + len =3D __symbol__join_symfs(filename, size, dso__long_name(dso)); last_slash =3D filename + len; while (last_slash !=3D filename && *last_slash !=3D '/') last_slash--; @@ -158,12 +164,12 @@ int dso__read_binary_type_filename(const struct dso *= dso, =20 case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: len =3D __symbol__join_symfs(filename, size, "/usr/lib/debug"); - snprintf(filename + len, size - len, "%s.debug", dso->long_name); + snprintf(filename + len, size - len, "%s.debug", dso__long_name(dso)); break; =20 case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: len =3D __symbol__join_symfs(filename, size, "/usr/lib/debug"); - snprintf(filename + len, size - len, "%s", dso->long_name); + snprintf(filename + len, size - len, "%s", dso__long_name(dso)); break; =20 case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: @@ -172,13 +178,13 @@ int dso__read_binary_type_filename(const struct dso *= dso, * /usr/lib/debug/lib when it is expected to be in * /usr/lib/debug/usr/lib */ - if (strlen(dso->long_name) < 9 || - strncmp(dso->long_name, "/usr/lib/", 9)) { + if (strlen(dso__long_name(dso)) < 9 || + strncmp(dso__long_name(dso), "/usr/lib/", 9)) { ret =3D -1; break; } len =3D __symbol__join_symfs(filename, size, "/usr/lib/debug"); - snprintf(filename + len, size - len, "%s", dso->long_name + 4); + snprintf(filename + len, size - len, "%s", dso__long_name(dso) + 4); break; =20 case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: @@ -186,29 +192,29 @@ int dso__read_binary_type_filename(const struct dso *= dso, const char *last_slash; size_t dir_size; =20 - last_slash =3D dso->long_name + dso->long_name_len; - while (last_slash !=3D dso->long_name && *last_slash !=3D '/') + last_slash =3D dso__long_name(dso) + dso__long_name_len(dso); + while (last_slash !=3D dso__long_name(dso) && *last_slash !=3D '/') last_slash--; =20 len =3D __symbol__join_symfs(filename, size, ""); - dir_size =3D last_slash - dso->long_name + 2; + dir_size =3D last_slash - dso__long_name(dso) + 2; if (dir_size > (size - len)) { ret =3D -1; break; } - len +=3D scnprintf(filename + len, dir_size, "%s", dso->long_name); + len +=3D scnprintf(filename + len, dir_size, "%s", dso__long_name(dso)); len +=3D scnprintf(filename + len , size - len, ".debug%s", last_slash); break; } =20 case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: - if (!dso->has_build_id) { + if (!dso__has_build_id(dso)) { ret =3D -1; break; } =20 - build_id__sprintf(&dso->bid, build_id_hex); + build_id__sprintf(dso__bid_const(dso), build_id_hex); len =3D __symbol__join_symfs(filename, size, "/usr/lib/debug/.build-id/"= ); snprintf(filename + len, size - len, "%.2s/%s.debug", build_id_hex, build_id_hex + 2); @@ -217,23 +223,23 @@ int dso__read_binary_type_filename(const struct dso *= dso, case DSO_BINARY_TYPE__VMLINUX: case DSO_BINARY_TYPE__GUEST_VMLINUX: case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: - __symbol__join_symfs(filename, size, dso->long_name); + __symbol__join_symfs(filename, size, dso__long_name(dso)); break; =20 case DSO_BINARY_TYPE__GUEST_KMODULE: case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: path__join3(filename, size, symbol_conf.symfs, - root_dir, dso->long_name); + root_dir, dso__long_name(dso)); break; =20 case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: - __symbol__join_symfs(filename, size, dso->long_name); + __symbol__join_symfs(filename, size, dso__long_name(dso)); break; =20 case DSO_BINARY_TYPE__KCORE: case DSO_BINARY_TYPE__GUEST_KCORE: - snprintf(filename, size, "%s", dso->long_name); + snprintf(filename, size, "%s", dso__long_name(dso)); break; =20 default: @@ -309,8 +315,8 @@ bool is_kernel_module(const char *pathname, int cpumode) =20 bool dso__needs_decompress(struct dso *dso) { - return dso->symtab_type =3D=3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP = || - dso->symtab_type =3D=3D DSO_BINARY_TYPE__GUEST_KMODULE_COMP; + return dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_= COMP || + dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__GUEST_KMODULE_COMP; } =20 int filename__decompress(const char *name, char *pathname, @@ -362,11 +368,10 @@ static int decompress_kmodule(struct dso *dso, const = char *name, if (!dso__needs_decompress(dso)) return -1; =20 - if (dso->comp =3D=3D COMP_ID__NONE) + if (dso__comp(dso) =3D=3D COMP_ID__NONE) return -1; =20 - return filename__decompress(name, pathname, len, dso->comp, - &dso->load_errno); + return filename__decompress(name, pathname, len, dso__comp(dso), dso__loa= d_errno(dso)); } =20 int dso__decompress_kmodule_fd(struct dso *dso, const char *name) @@ -467,17 +472,17 @@ void dso__set_module_info(struct dso *dso, struct kmo= d_path *m, struct machine *machine) { if (machine__is_host(machine)) - dso->symtab_type =3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE; + dso__set_symtab_type(dso, DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE); else - dso->symtab_type =3D DSO_BINARY_TYPE__GUEST_KMODULE; + dso__set_symtab_type(dso, DSO_BINARY_TYPE__GUEST_KMODULE); =20 /* _KMODULE_COMP should be next to _KMODULE */ if (m->kmod && m->comp) { - dso->symtab_type++; - dso->comp =3D m->comp; + dso__set_symtab_type(dso, dso__symtab_type(dso) + 1); + dso__set_comp(dso, m->comp); } =20 - dso->is_kmod =3D 1; + dso__set_is_kmod(dso); dso__set_short_name(dso, strdup(m->name), true); } =20 @@ -490,13 +495,15 @@ static pthread_mutex_t dso__data_open_lock =3D PTHREA= D_MUTEX_INITIALIZER; =20 static void dso__list_add(struct dso *dso) { - list_add_tail(&dso->data.open_entry, &dso__data_open); + list_add_tail(&dso__data(dso)->open_entry, &dso__data_open); + dso__data(dso)->dso =3D dso__get(dso); dso__data_open_cnt++; } =20 static void dso__list_del(struct dso *dso) { - list_del_init(&dso->data.open_entry); + list_del_init(&dso__data(dso)->open_entry); + dso__put(dso__data(dso)->dso); WARN_ONCE(dso__data_open_cnt <=3D 0, "DSO data fd counter out of bounds."); dso__data_open_cnt--; @@ -527,7 +534,7 @@ static int do_open(char *name) =20 char *dso__filename_with_chroot(const struct dso *dso, const char *filenam= e) { - return filename_with_chroot(nsinfo__pid(dso->nsinfo), filename); + return filename_with_chroot(nsinfo__pid(dso__nsinfo_const(dso)), filename= ); } =20 static int __open_dso(struct dso *dso, struct machine *machine) @@ -540,18 +547,18 @@ static int __open_dso(struct dso *dso, struct machine= *machine) if (!name) return -ENOMEM; =20 - mutex_lock(&dso->lock); + mutex_lock(dso__lock(dso)); if (machine) root_dir =3D machine->root_dir; =20 - if (dso__read_binary_type_filename(dso, dso->binary_type, + if (dso__read_binary_type_filename(dso, dso__binary_type(dso), root_dir, name, PATH_MAX)) goto out; =20 if (!is_regular_file(name)) { char *new_name; =20 - if (errno !=3D ENOENT || dso->nsinfo =3D=3D NULL) + if (errno !=3D ENOENT || dso__nsinfo(dso) =3D=3D NULL) goto out; =20 new_name =3D dso__filename_with_chroot(dso, name); @@ -567,7 +574,7 @@ static int __open_dso(struct dso *dso, struct machine *= machine) size_t len =3D sizeof(newpath); =20 if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) { - fd =3D -dso->load_errno; + fd =3D -(*dso__load_errno(dso)); goto out; } =20 @@ -581,7 +588,7 @@ static int __open_dso(struct dso *dso, struct machine *= machine) unlink(name); =20 out: - mutex_unlock(&dso->lock); + mutex_unlock(dso__lock(dso)); free(name); return fd; } @@ -600,13 +607,13 @@ static int open_dso(struct dso *dso, struct machine *= machine) int fd; struct nscookie nsc; =20 - if (dso->binary_type !=3D DSO_BINARY_TYPE__BUILD_ID_CACHE) { - mutex_lock(&dso->lock); - nsinfo__mountns_enter(dso->nsinfo, &nsc); - mutex_unlock(&dso->lock); + if (dso__binary_type(dso) !=3D DSO_BINARY_TYPE__BUILD_ID_CACHE) { + mutex_lock(dso__lock(dso)); + nsinfo__mountns_enter(dso__nsinfo(dso), &nsc); + mutex_unlock(dso__lock(dso)); } fd =3D __open_dso(dso, machine); - if (dso->binary_type !=3D DSO_BINARY_TYPE__BUILD_ID_CACHE) + if (dso__binary_type(dso) !=3D DSO_BINARY_TYPE__BUILD_ID_CACHE) nsinfo__mountns_exit(&nsc); =20 if (fd >=3D 0) { @@ -623,10 +630,10 @@ static int open_dso(struct dso *dso, struct machine *= machine) =20 static void close_data_fd(struct dso *dso) { - if (dso->data.fd >=3D 0) { - close(dso->data.fd); - dso->data.fd =3D -1; - dso->data.file_size =3D 0; + if (dso__data(dso)->fd >=3D 0) { + close(dso__data(dso)->fd); + dso__data(dso)->fd =3D -1; + dso__data(dso)->file_size =3D 0; dso__list_del(dso); } } @@ -645,10 +652,10 @@ static void close_dso(struct dso *dso) =20 static void close_first_dso(void) { - struct dso *dso; + struct dso_data *dso_data; =20 - dso =3D list_first_entry(&dso__data_open, struct dso, data.open_entry); - close_dso(dso); + dso_data =3D list_first_entry(&dso__data_open, struct dso_data, open_entr= y); + close_dso(dso_data->dso); } =20 static rlim_t get_fd_limit(void) @@ -727,28 +734,29 @@ static void try_to_open_dso(struct dso *dso, struct m= achine *machine) DSO_BINARY_TYPE__NOT_FOUND, }; int i =3D 0; + struct dso_data *dso_data =3D dso__data(dso); =20 - if (dso->data.fd >=3D 0) + if (dso_data->fd >=3D 0) return; =20 - if (dso->binary_type !=3D DSO_BINARY_TYPE__NOT_FOUND) { - dso->data.fd =3D open_dso(dso, machine); + if (dso__binary_type(dso) !=3D DSO_BINARY_TYPE__NOT_FOUND) { + dso_data->fd =3D open_dso(dso, machine); goto out; } =20 do { - dso->binary_type =3D binary_type_data[i++]; + dso__set_binary_type(dso, binary_type_data[i++]); =20 - dso->data.fd =3D open_dso(dso, machine); - if (dso->data.fd >=3D 0) + dso_data->fd =3D open_dso(dso, machine); + if (dso_data->fd >=3D 0) goto out; =20 - } while (dso->binary_type !=3D DSO_BINARY_TYPE__NOT_FOUND); + } while (dso__binary_type(dso) !=3D DSO_BINARY_TYPE__NOT_FOUND); out: - if (dso->data.fd >=3D 0) - dso->data.status =3D DSO_DATA_STATUS_OK; + if (dso_data->fd >=3D 0) + dso_data->status =3D DSO_DATA_STATUS_OK; else - dso->data.status =3D DSO_DATA_STATUS_ERROR; + dso_data->status =3D DSO_DATA_STATUS_ERROR; } =20 /** @@ -762,7 +770,7 @@ static void try_to_open_dso(struct dso *dso, struct mac= hine *machine) */ int dso__data_get_fd(struct dso *dso, struct machine *machine) { - if (dso->data.status =3D=3D DSO_DATA_STATUS_ERROR) + if (dso__data(dso)->status =3D=3D DSO_DATA_STATUS_ERROR) return -1; =20 if (pthread_mutex_lock(&dso__data_open_lock) < 0) @@ -770,10 +778,10 @@ int dso__data_get_fd(struct dso *dso, struct machine = *machine) =20 try_to_open_dso(dso, machine); =20 - if (dso->data.fd < 0) + if (dso__data(dso)->fd < 0) pthread_mutex_unlock(&dso__data_open_lock); =20 - return dso->data.fd; + return dso__data(dso)->fd; } =20 void dso__data_put_fd(struct dso *dso __maybe_unused) @@ -785,10 +793,10 @@ bool dso__data_status_seen(struct dso *dso, enum dso_= data_status_seen by) { u32 flag =3D 1 << by; =20 - if (dso->data.status_seen & flag) + if (dso__data(dso)->status_seen & flag) return true; =20 - dso->data.status_seen |=3D flag; + dso__data(dso)->status_seen |=3D flag; =20 return false; } @@ -798,12 +806,13 @@ static ssize_t bpf_read(struct dso *dso, u64 offset, = char *data) { struct bpf_prog_info_node *node; ssize_t size =3D DSO__DATA_CACHE_SIZE; + struct dso_bpf_prog *dso_bpf_prog =3D dso__bpf_prog(dso); u64 len; u8 *buf; =20 - node =3D perf_env__find_bpf_prog_info(dso->bpf_prog.env, dso->bpf_prog.id= ); + node =3D perf_env__find_bpf_prog_info(dso_bpf_prog->env, dso_bpf_prog->id= ); if (!node || !node->info_linear) { - dso->data.status =3D DSO_DATA_STATUS_ERROR; + dso__data(dso)->status =3D DSO_DATA_STATUS_ERROR; return -1; } =20 @@ -821,14 +830,15 @@ static ssize_t bpf_read(struct dso *dso, u64 offset, = char *data) static int bpf_size(struct dso *dso) { struct bpf_prog_info_node *node; + struct dso_bpf_prog *dso_bpf_prog =3D dso__bpf_prog(dso); =20 - node =3D perf_env__find_bpf_prog_info(dso->bpf_prog.env, dso->bpf_prog.id= ); + node =3D perf_env__find_bpf_prog_info(dso_bpf_prog->env, dso_bpf_prog->id= ); if (!node || !node->info_linear) { - dso->data.status =3D DSO_DATA_STATUS_ERROR; + dso__data(dso)->status =3D DSO_DATA_STATUS_ERROR; return -1; } =20 - dso->data.file_size =3D node->info_linear->info.jited_prog_len; + dso__data(dso)->file_size =3D node->info_linear->info.jited_prog_len; return 0; } #endif // HAVE_LIBBPF_SUPPORT @@ -836,10 +846,10 @@ static int bpf_size(struct dso *dso) static void dso_cache__free(struct dso *dso) { - struct rb_root *root =3D &dso->data.cache; + struct rb_root *root =3D &dso__data(dso)->cache; struct rb_node *next =3D rb_first(root); =20 - mutex_lock(&dso->lock); + mutex_lock(dso__lock(dso)); while (next) { struct dso_cache *cache; =20 @@ -848,12 +858,12 @@ dso_cache__free(struct dso *dso) rb_erase(&cache->rb_node, root); free(cache); } - mutex_unlock(&dso->lock); + mutex_unlock(dso__lock(dso)); } =20 static struct dso_cache *__dso_cache__find(struct dso *dso, u64 offset) { - const struct rb_root *root =3D &dso->data.cache; + const struct rb_root *root =3D &dso__data(dso)->cache; struct rb_node * const *p =3D &root->rb_node; const struct rb_node *parent =3D NULL; struct dso_cache *cache; @@ -879,13 +889,13 @@ static struct dso_cache *__dso_cache__find(struct dso= *dso, u64 offset) static struct dso_cache * dso_cache__insert(struct dso *dso, struct dso_cache *new) { - struct rb_root *root =3D &dso->data.cache; + struct rb_root *root =3D &dso__data(dso)->cache; struct rb_node **p =3D &root->rb_node; struct rb_node *parent =3D NULL; struct dso_cache *cache; u64 offset =3D new->offset; =20 - mutex_lock(&dso->lock); + mutex_lock(dso__lock(dso)); while (*p !=3D NULL) { u64 end; =20 @@ -906,7 +916,7 @@ dso_cache__insert(struct dso *dso, struct dso_cache *ne= w) =20 cache =3D NULL; out: - mutex_unlock(&dso->lock); + mutex_unlock(dso__lock(dso)); return cache; } =20 @@ -931,18 +941,18 @@ static ssize_t file_read(struct dso *dso, struct mach= ine *machine, pthread_mutex_lock(&dso__data_open_lock); =20 /* - * dso->data.fd might be closed if other thread opened another + * dso__data(dso)->fd might be closed if other thread opened another * file (dso) due to open file limit (RLIMIT_NOFILE). */ try_to_open_dso(dso, machine); =20 - if (dso->data.fd < 0) { - dso->data.status =3D DSO_DATA_STATUS_ERROR; + if (dso__data(dso)->fd < 0) { + dso__data(dso)->status =3D DSO_DATA_STATUS_ERROR; ret =3D -errno; goto out; } =20 - ret =3D pread(dso->data.fd, data, DSO__DATA_CACHE_SIZE, offset); + ret =3D pread(dso__data(dso)->fd, data, DSO__DATA_CACHE_SIZE, offset); out: pthread_mutex_unlock(&dso__data_open_lock); return ret; @@ -962,11 +972,11 @@ static struct dso_cache *dso_cache__populate(struct d= so *dso, return NULL; } #ifdef HAVE_LIBBPF_SUPPORT - if (dso->binary_type =3D=3D DSO_BINARY_TYPE__BPF_PROG_INFO) + if (dso__binary_type(dso) =3D=3D DSO_BINARY_TYPE__BPF_PROG_INFO) *ret =3D bpf_read(dso, cache_offset, cache->data); else #endif - if (dso->binary_type =3D=3D DSO_BINARY_TYPE__OOL) + if (dso__binary_type(dso) =3D=3D DSO_BINARY_TYPE__OOL) *ret =3D DSO__DATA_CACHE_SIZE; else *ret =3D file_read(dso, machine, cache_offset, cache->data); @@ -1055,25 +1065,25 @@ static int file_size(struct dso *dso, struct machin= e *machine) pthread_mutex_lock(&dso__data_open_lock); =20 /* - * dso->data.fd might be closed if other thread opened another + * dso__data(dso)->fd might be closed if other thread opened another * file (dso) due to open file limit (RLIMIT_NOFILE). */ try_to_open_dso(dso, machine); =20 - if (dso->data.fd < 0) { + if (dso__data(dso)->fd < 0) { ret =3D -errno; - dso->data.status =3D DSO_DATA_STATUS_ERROR; + dso__data(dso)->status =3D DSO_DATA_STATUS_ERROR; goto out; } =20 - if (fstat(dso->data.fd, &st) < 0) { + if (fstat(dso__data(dso)->fd, &st) < 0) { ret =3D -errno; pr_err("dso cache fstat failed: %s\n", str_error_r(errno, sbuf, sizeof(sbuf))); - dso->data.status =3D DSO_DATA_STATUS_ERROR; + dso__data(dso)->status =3D DSO_DATA_STATUS_ERROR; goto out; } - dso->data.file_size =3D st.st_size; + dso__data(dso)->file_size =3D st.st_size; =20 out: pthread_mutex_unlock(&dso__data_open_lock); @@ -1082,13 +1092,13 @@ static int file_size(struct dso *dso, struct machin= e *machine) =20 int dso__data_file_size(struct dso *dso, struct machine *machine) { - if (dso->data.file_size) + if (dso__data(dso)->file_size) return 0; =20 - if (dso->data.status =3D=3D DSO_DATA_STATUS_ERROR) + if (dso__data(dso)->status =3D=3D DSO_DATA_STATUS_ERROR) return -1; #ifdef HAVE_LIBBPF_SUPPORT - if (dso->binary_type =3D=3D DSO_BINARY_TYPE__BPF_PROG_INFO) + if (dso__binary_type(dso) =3D=3D DSO_BINARY_TYPE__BPF_PROG_INFO) return bpf_size(dso); #endif return file_size(dso, machine); @@ -1107,7 +1117,7 @@ off_t dso__data_size(struct dso *dso, struct machine = *machine) return -1; =20 /* For now just estimate dso data size is close to file size */ - return dso->data.file_size; + return dso__data(dso)->file_size; } =20 static ssize_t data_read_write_offset(struct dso *dso, struct machine *mac= hine, @@ -1118,7 +1128,7 @@ static ssize_t data_read_write_offset(struct dso *dso= , struct machine *machine, return -1; =20 /* Check the offset sanity. */ - if (offset > dso->data.file_size) + if (offset > dso__data(dso)->file_size) return -1; =20 if (offset + size < offset) @@ -1141,7 +1151,7 @@ static ssize_t data_read_write_offset(struct dso *dso= , struct machine *machine, ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, u64 offset, u8 *data, ssize_t size) { - if (dso->data.status =3D=3D DSO_DATA_STATUS_ERROR) + if (dso__data(dso)->status =3D=3D DSO_DATA_STATUS_ERROR) return -1; =20 return data_read_write_offset(dso, machine, offset, data, size, true); @@ -1181,7 +1191,7 @@ ssize_t dso__data_write_cache_offs(struct dso *dso, s= truct machine *machine, { u8 *data =3D (u8 *)data_in; /* cast away const to use same fns for r/w */ =20 - if (dso->data.status =3D=3D DSO_DATA_STATUS_ERROR) + if (dso__data(dso)->status =3D=3D DSO_DATA_STATUS_ERROR) return -1; =20 return data_read_write_offset(dso, machine, offset, data, size, false); @@ -1234,7 +1244,7 @@ struct dso *machine__findnew_kernel(struct machine *m= achine, const char *name, */ if (dso !=3D NULL) { dso__set_short_name(dso, short_name, false); - dso->kernel =3D dso_type; + dso__set_kernel(dso, dso_type); } =20 return dso; @@ -1242,7 +1252,7 @@ struct dso *machine__findnew_kernel(struct machine *m= achine, const char *name, =20 static void dso__set_long_name_id(struct dso *dso, const char *name, bool = name_allocated) { - struct dsos *dsos =3D dso->dsos; + struct dsos *dsos =3D dso__dsos(dso); =20 if (name =3D=3D NULL) return; @@ -1255,12 +1265,12 @@ static void dso__set_long_name_id(struct dso *dso, = const char *name, bool name_a down_write(&dsos->lock); } =20 - if (dso->long_name_allocated) - free((char *)dso->long_name); + if (dso__long_name_allocated(dso)) + free((char *)dso__long_name(dso)); =20 - dso->long_name =3D name; - dso->long_name_len =3D strlen(name); - dso->long_name_allocated =3D name_allocated; + RC_CHK_ACCESS(dso)->long_name =3D name; + RC_CHK_ACCESS(dso)->long_name_len =3D strlen(name); + dso__set_long_name_allocated(dso, name_allocated); =20 if (dsos) { dsos->sorted =3D false; @@ -1306,14 +1316,15 @@ bool dso_id__empty(const struct dso_id *id) =20 void __dso__inject_id(struct dso *dso, struct dso_id *id) { - struct dsos *dsos =3D dso->dsos; + struct dsos *dsos =3D dso__dsos(dso); + struct dso_id *dso_id =3D dso__id(dso); =20 /* dsos write lock held by caller. */ =20 - dso->id.maj =3D id->maj; - dso->id.min =3D id->min; - dso->id.ino =3D id->ino; - dso->id.ino_generation =3D id->ino_generation; + dso_id->maj =3D id->maj; + dso_id->min =3D id->min; + dso_id->ino =3D id->ino; + dso_id->ino_generation =3D id->ino_generation; =20 if (dsos) dsos->sorted =3D false; @@ -1333,7 +1344,7 @@ int dso_id__cmp(const struct dso_id *a, const struct = dso_id *b) =20 int dso__cmp_id(struct dso *a, struct dso *b) { - return __dso_id__cmp(&a->id, &b->id); + return __dso_id__cmp(dso__id(a), dso__id(b)); } =20 void dso__set_long_name(struct dso *dso, const char *name, bool name_alloc= ated) @@ -1343,7 +1354,7 @@ void dso__set_long_name(struct dso *dso, const char *= name, bool name_allocated) =20 void dso__set_short_name(struct dso *dso, const char *name, bool name_allo= cated) { - struct dsos *dsos =3D dso->dsos; + struct dsos *dsos =3D dso__dsos(dso); =20 if (name =3D=3D NULL) return; @@ -1355,12 +1366,12 @@ void dso__set_short_name(struct dso *dso, const cha= r *name, bool name_allocated) */ down_write(&dsos->lock); } - if (dso->short_name_allocated) - free((char *)dso->short_name); + if (dso__short_name_allocated(dso)) + free((char *)dso__short_name(dso)); =20 - dso->short_name =3D name; - dso->short_name_len =3D strlen(name); - dso->short_name_allocated =3D name_allocated; + RC_CHK_ACCESS(dso)->short_name =3D name; + RC_CHK_ACCESS(dso)->short_name_len =3D strlen(name); + dso__set_short_name_allocated(dso, name_allocated); =20 if (dsos) { dsos->sorted =3D false; @@ -1373,44 +1384,46 @@ int dso__name_len(const struct dso *dso) if (!dso) return strlen("[unknown]"); if (verbose > 0) - return dso->long_name_len; + return dso__long_name_len(dso); =20 - return dso->short_name_len; + return dso__short_name_len(dso); } =20 bool dso__loaded(const struct dso *dso) { - return dso->loaded; + return RC_CHK_ACCESS(dso)->loaded; } =20 bool dso__sorted_by_name(const struct dso *dso) { - return dso->sorted_by_name; + return RC_CHK_ACCESS(dso)->sorted_by_name; } =20 void dso__set_sorted_by_name(struct dso *dso) { - dso->sorted_by_name =3D true; + RC_CHK_ACCESS(dso)->sorted_by_name =3D true; } =20 struct dso *dso__new_id(const char *name, struct dso_id *id) { - struct dso *dso =3D calloc(1, sizeof(*dso) + strlen(name) + 1); + RC_STRUCT(dso) *dso =3D zalloc(sizeof(*dso) + strlen(name) + 1); + struct dso *res; + struct dso_data *data; =20 - if (dso !=3D NULL) { + if (!dso) + return NULL; + + if (ADD_RC_CHK(res, dso)) { strcpy(dso->name, name); if (id) dso->id =3D *id; - dso__set_long_name_id(dso, dso->name, false); - dso__set_short_name(dso, dso->name, false); + dso__set_long_name_id(res, dso->name, false); + dso__set_short_name(res, dso->name, false); dso->symbols =3D RB_ROOT_CACHED; dso->symbol_names =3D NULL; dso->symbol_names_len =3D 0; - dso->data.cache =3D RB_ROOT; dso->inlined_nodes =3D RB_ROOT_CACHED; dso->srclines =3D RB_ROOT_CACHED; - dso->data.fd =3D -1; - dso->data.status =3D DSO_DATA_STATUS_UNKNOWN; dso->symtab_type =3D DSO_BINARY_TYPE__NOT_FOUND; dso->binary_type =3D DSO_BINARY_TYPE__NOT_FOUND; dso->is_64_bit =3D (sizeof(void *) =3D=3D 8); @@ -1424,12 +1437,16 @@ struct dso *dso__new_id(const char *name, struct ds= o_id *id) dso->is_kmod =3D 0; dso->needs_swap =3D DSO_SWAP__UNSET; dso->comp =3D COMP_ID__NONE; - INIT_LIST_HEAD(&dso->data.open_entry); mutex_init(&dso->lock); refcount_set(&dso->refcnt, 1); + data =3D &dso->data; + data->cache =3D RB_ROOT; + data->fd =3D -1; + data->status =3D DSO_DATA_STATUS_UNKNOWN; + INIT_LIST_HEAD(&data->open_entry); + data->dso =3D NULL; /* Set when on the open_entry list. */ } - - return dso; + return res; } =20 struct dso *dso__new(const char *name) @@ -1439,68 +1456,75 @@ struct dso *dso__new(const char *name) =20 void dso__delete(struct dso *dso) { - if (dso->dsos) - pr_err("DSO %s is still in rbtree when being deleted!\n", dso->long_name= ); + if (dso__dsos(dso)) + pr_err("DSO %s is still in rbtree when being deleted!\n", dso__long_name= (dso)); =20 /* free inlines first, as they reference symbols */ - inlines__tree_delete(&dso->inlined_nodes); - srcline__tree_delete(&dso->srclines); - symbols__delete(&dso->symbols); - dso->symbol_names_len =3D 0; - zfree(&dso->symbol_names); - if (dso->short_name_allocated) { - zfree((char **)&dso->short_name); - dso->short_name_allocated =3D false; + inlines__tree_delete(&RC_CHK_ACCESS(dso)->inlined_nodes); + srcline__tree_delete(&RC_CHK_ACCESS(dso)->srclines); + symbols__delete(&RC_CHK_ACCESS(dso)->symbols); + RC_CHK_ACCESS(dso)->symbol_names_len =3D 0; + zfree(&RC_CHK_ACCESS(dso)->symbol_names); + if (RC_CHK_ACCESS(dso)->short_name_allocated) { + zfree((char **)&RC_CHK_ACCESS(dso)->short_name); + RC_CHK_ACCESS(dso)->short_name_allocated =3D false; } =20 - if (dso->long_name_allocated) { - zfree((char **)&dso->long_name); - dso->long_name_allocated =3D false; + if (RC_CHK_ACCESS(dso)->long_name_allocated) { + zfree((char **)&RC_CHK_ACCESS(dso)->long_name); + RC_CHK_ACCESS(dso)->long_name_allocated =3D false; } =20 dso__data_close(dso); - auxtrace_cache__free(dso->auxtrace_cache); + auxtrace_cache__free(RC_CHK_ACCESS(dso)->auxtrace_cache); dso_cache__free(dso); dso__free_a2l(dso); - zfree(&dso->symsrc_filename); - nsinfo__zput(dso->nsinfo); - mutex_destroy(&dso->lock); - free(dso); + zfree(&RC_CHK_ACCESS(dso)->symsrc_filename); + nsinfo__zput(RC_CHK_ACCESS(dso)->nsinfo); + mutex_destroy(dso__lock(dso)); + RC_CHK_FREE(dso); } =20 struct dso *dso__get(struct dso *dso) { - if (dso) - refcount_inc(&dso->refcnt); - return dso; + struct dso *result; + + if (RC_CHK_GET(result, dso)) + refcount_inc(&RC_CHK_ACCESS(dso)->refcnt); + + return result; } =20 void dso__put(struct dso *dso) { - if (dso && refcount_dec_and_test(&dso->refcnt)) + if (dso && refcount_dec_and_test(&RC_CHK_ACCESS(dso)->refcnt)) dso__delete(dso); + else + RC_CHK_PUT(dso); } =20 void dso__set_build_id(struct dso *dso, struct build_id *bid) { - dso->bid =3D *bid; - dso->has_build_id =3D 1; + RC_CHK_ACCESS(dso)->bid =3D *bid; + RC_CHK_ACCESS(dso)->has_build_id =3D 1; } =20 bool dso__build_id_equal(const struct dso *dso, struct build_id *bid) { - if (dso->bid.size > bid->size && dso->bid.size =3D=3D BUILD_ID_SIZE) { + const struct build_id *dso_bid =3D dso__bid_const(dso); + + if (dso_bid->size > bid->size && dso_bid->size =3D=3D BUILD_ID_SIZE) { /* * For the backward compatibility, it allows a build-id has * trailing zeros. */ - return !memcmp(dso->bid.data, bid->data, bid->size) && - !memchr_inv(&dso->bid.data[bid->size], 0, - dso->bid.size - bid->size); + return !memcmp(dso_bid->data, bid->data, bid->size) && + !memchr_inv(&dso_bid->data[bid->size], 0, + dso_bid->size - bid->size); } =20 - return dso->bid.size =3D=3D bid->size && - memcmp(dso->bid.data, bid->data, dso->bid.size) =3D=3D 0; + return dso_bid->size =3D=3D bid->size && + memcmp(dso_bid->data, bid->data, dso_bid->size) =3D=3D 0; } =20 void dso__read_running_kernel_build_id(struct dso *dso, struct machine *ma= chine) @@ -1510,8 +1534,8 @@ void dso__read_running_kernel_build_id(struct dso *ds= o, struct machine *machine) if (machine__is_default_guest(machine)) return; sprintf(path, "%s/sys/kernel/notes", machine->root_dir); - if (sysfs__read_build_id(path, &dso->bid) =3D=3D 0) - dso->has_build_id =3D true; + if (sysfs__read_build_id(path, dso__bid(dso)) =3D=3D 0) + dso__set_has_build_id(dso); } =20 int dso__kernel_module_get_build_id(struct dso *dso, @@ -1522,14 +1546,14 @@ int dso__kernel_module_get_build_id(struct dso *dso, * kernel module short names are of the form "[module]" and * we need just "module" here. */ - const char *name =3D dso->short_name + 1; + const char *name =3D dso__short_name(dso) + 1; =20 snprintf(filename, sizeof(filename), "%s/sys/module/%.*s/notes/.note.gnu.build-id", root_dir, (int)strlen(name) - 1, name); =20 - if (sysfs__read_build_id(filename, &dso->bid) =3D=3D 0) - dso->has_build_id =3D true; + if (sysfs__read_build_id(filename, dso__bid(dso)) =3D=3D 0) + dso__set_has_build_id(dso); =20 return 0; } @@ -1538,21 +1562,21 @@ static size_t dso__fprintf_buildid(struct dso *dso,= FILE *fp) { char sbuild_id[SBUILD_ID_SIZE]; =20 - build_id__sprintf(&dso->bid, sbuild_id); + build_id__sprintf(dso__bid(dso), sbuild_id); return fprintf(fp, "%s", sbuild_id); } =20 size_t dso__fprintf(struct dso *dso, FILE *fp) { struct rb_node *nd; - size_t ret =3D fprintf(fp, "dso: %s (", dso->short_name); + size_t ret =3D fprintf(fp, "dso: %s (", dso__short_name(dso)); =20 - if (dso->short_name !=3D dso->long_name) - ret +=3D fprintf(fp, "%s, ", dso->long_name); + if (dso__short_name(dso) !=3D dso__long_name(dso)) + ret +=3D fprintf(fp, "%s, ", dso__long_name(dso)); ret +=3D fprintf(fp, "%sloaded, ", dso__loaded(dso) ? "" : "NOT "); ret +=3D dso__fprintf_buildid(dso, fp); ret +=3D fprintf(fp, ")\n"); - for (nd =3D rb_first_cached(&dso->symbols); nd; nd =3D rb_next(nd)) { + for (nd =3D rb_first_cached(dso__symbols(dso)); nd; nd =3D rb_next(nd)) { struct symbol *pos =3D rb_entry(nd, struct symbol, rb_node); ret +=3D symbol__fprintf(pos, fp); } @@ -1576,7 +1600,7 @@ enum dso_type dso__type(struct dso *dso, struct machi= ne *machine) =20 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen) { - int idx, errnum =3D dso->load_errno; + int idx, errnum =3D *dso__load_errno(dso); /* * This must have a same ordering as the enum dso_load_errno. */ diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index fd500583cd2e..fa311ffd2538 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -11,6 +11,7 @@ #include #include "build-id.h" #include "mutex.h" +#include =20 struct machine; struct map; @@ -100,26 +101,27 @@ enum dso_load_errno { __DSO_LOAD_ERRNO__END, }; =20 -#define DSO__SWAP(dso, type, val) \ -({ \ - type ____r =3D val; \ - BUG_ON(dso->needs_swap =3D=3D DSO_SWAP__UNSET); \ - if (dso->needs_swap =3D=3D DSO_SWAP__YES) { \ - switch (sizeof(____r)) { \ - case 2: \ - ____r =3D bswap_16(val); \ - break; \ - case 4: \ - ____r =3D bswap_32(val); \ - break; \ - case 8: \ - ____r =3D bswap_64(val); \ - break; \ - default: \ - BUG_ON(1); \ - } \ - } \ - ____r; \ +#define DSO__SWAP(dso, type, val) \ +({ \ + type ____r =3D val; \ + enum dso_swap_type ___dst =3D dso__needs_swap(dso); \ + BUG_ON(___dst =3D=3D DSO_SWAP__UNSET); \ + if (___dst =3D=3D DSO_SWAP__YES) { \ + switch (sizeof(____r)) { \ + case 2: \ + ____r =3D bswap_16(val); \ + break; \ + case 4: \ + ____r =3D bswap_32(val); \ + break; \ + case 8: \ + ____r =3D bswap_64(val); \ + break; \ + default: \ + BUG_ON(1); \ + } \ + } \ + ____r; \ }) =20 #define DSO__DATA_CACHE_SIZE 4096 @@ -142,9 +144,29 @@ struct dso_cache { char data[]; }; =20 +struct dso_data { + struct rb_root cache; + struct list_head open_entry; + struct dso *dso; + int fd; + int status; + u32 status_seen; + u64 file_size; + u64 elf_base_addr; + u64 debug_frame_offset; + u64 eh_frame_hdr_addr; + u64 eh_frame_hdr_offset; +}; + +struct dso_bpf_prog { + u32 id; + u32 sub_id; + struct perf_env *env; +}; + struct auxtrace_cache; =20 -struct dso { +DECLARE_RC_STRUCT(dso) { struct mutex lock; struct dsos *dsos; struct rb_root_cached symbols; @@ -173,24 +195,9 @@ struct dso { u64 db_id; }; /* bpf prog information */ - struct { - struct perf_env *env; - u32 id; - u32 sub_id; - } bpf_prog; + struct dso_bpf_prog bpf_prog; /* dso data file */ - struct { - struct rb_root cache; - struct list_head open_entry; - u64 file_size; - u64 elf_base_addr; - u64 debug_frame_offset; - u64 eh_frame_hdr_addr; - u64 eh_frame_hdr_offset; - int fd; - int status; - u32 status_seen; - } data; + struct dso_data data; struct dso_id id; unsigned int a2l_fails; int comp; @@ -226,11 +233,378 @@ struct dso { * @n: the 'struct rb_node *' to use as a temporary storage */ #define dso__for_each_symbol(dso, pos, n) \ - symbols__for_each_entry(&(dso)->symbols, pos, n) + symbols__for_each_entry(dso__symbols(dso), pos, n) + +static inline void *dso__a2l(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->a2l; +} + +static inline void dso__set_a2l(struct dso *dso, void *val) +{ + RC_CHK_ACCESS(dso)->a2l =3D val; +} + +static inline unsigned int dso__a2l_fails(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->a2l_fails; +} + +static inline void dso__set_a2l_fails(struct dso *dso, unsigned int val) +{ + RC_CHK_ACCESS(dso)->a2l_fails =3D val; +} + +static inline bool dso__adjust_symbols(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->adjust_symbols; +} + +static inline void dso__set_adjust_symbols(struct dso *dso, bool val) +{ + RC_CHK_ACCESS(dso)->adjust_symbols =3D val; +} + +static inline bool dso__annotate_warned(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->annotate_warned; +} + +static inline void dso__set_annotate_warned(struct dso *dso) +{ + RC_CHK_ACCESS(dso)->annotate_warned =3D 1; +} + +static inline struct auxtrace_cache *dso__auxtrace_cache(struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->auxtrace_cache; +} + +static inline void dso__set_auxtrace_cache(struct dso *dso, struct auxtrac= e_cache *cache) +{ + RC_CHK_ACCESS(dso)->auxtrace_cache =3D cache; +} + +static inline struct build_id *dso__bid(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->bid; +} + +static inline const struct build_id *dso__bid_const(const struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->bid; +} + +static inline struct dso_bpf_prog *dso__bpf_prog(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->bpf_prog; +} + +static inline bool dso__has_build_id(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->has_build_id; +} + +static inline void dso__set_has_build_id(struct dso *dso) +{ + RC_CHK_ACCESS(dso)->has_build_id =3D true; +} + +static inline bool dso__has_srcline(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->has_srcline; +} + +static inline void dso__set_has_srcline(struct dso *dso, bool val) +{ + RC_CHK_ACCESS(dso)->has_srcline =3D val; +} + +static inline int dso__comp(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->comp; +} + +static inline void dso__set_comp(struct dso *dso, int comp) +{ + RC_CHK_ACCESS(dso)->comp =3D comp; +} + +static inline struct dso_data *dso__data(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->data; +} + +static inline u64 dso__db_id(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->db_id; +} + +static inline void dso__set_db_id(struct dso *dso, u64 db_id) +{ + RC_CHK_ACCESS(dso)->db_id =3D db_id; +} + +static inline struct dsos *dso__dsos(struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->dsos; +} + +static inline void dso__set_dsos(struct dso *dso, struct dsos *dsos) +{ + RC_CHK_ACCESS(dso)->dsos =3D dsos; +} + +static inline bool dso__header_build_id(struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->header_build_id; +} + +static inline void dso__set_header_build_id(struct dso *dso, bool val) +{ + RC_CHK_ACCESS(dso)->header_build_id =3D val; +} + +static inline bool dso__hit(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->hit; +} + +static inline void dso__set_hit(struct dso *dso) +{ + RC_CHK_ACCESS(dso)->hit =3D 1; +} + +static inline struct dso_id *dso__id(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->id; +} + +static inline const struct dso_id *dso__id_const(const struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->id; +} + +static inline struct rb_root_cached *dso__inlined_nodes(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->inlined_nodes; +} + +static inline bool dso__is_64_bit(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->is_64_bit; +} + +static inline void dso__set_is_64_bit(struct dso *dso, bool is) +{ + RC_CHK_ACCESS(dso)->is_64_bit =3D is; +} + +static inline bool dso__is_kmod(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->is_kmod; +} + +static inline void dso__set_is_kmod(struct dso *dso) +{ + RC_CHK_ACCESS(dso)->is_kmod =3D 1; +} + +static inline enum dso_space_type dso__kernel(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->kernel; +} + +static inline void dso__set_kernel(struct dso *dso, enum dso_space_type ke= rnel) +{ + RC_CHK_ACCESS(dso)->kernel =3D kernel; +} + +static inline u64 dso__last_find_result_addr(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->last_find_result.addr; +} + +static inline void dso__set_last_find_result_addr(struct dso *dso, u64 add= r) +{ + RC_CHK_ACCESS(dso)->last_find_result.addr =3D addr; +} + +static inline struct symbol *dso__last_find_result_symbol(const struct dso= *dso) +{ + return RC_CHK_ACCESS(dso)->last_find_result.symbol; +} + +static inline void dso__set_last_find_result_symbol(struct dso *dso, struc= t symbol *symbol) +{ + RC_CHK_ACCESS(dso)->last_find_result.symbol =3D symbol; +} + +static inline enum dso_load_errno *dso__load_errno(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->load_errno; +} =20 static inline void dso__set_loaded(struct dso *dso) { - dso->loaded =3D true; + RC_CHK_ACCESS(dso)->loaded =3D true; +} + +static inline struct mutex *dso__lock(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->lock; +} + +static inline const char *dso__long_name(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->long_name; +} + +static inline bool dso__long_name_allocated(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->long_name_allocated; +} + +static inline void dso__set_long_name_allocated(struct dso *dso, bool allo= cated) +{ + RC_CHK_ACCESS(dso)->long_name_allocated =3D allocated; +} + +static inline u16 dso__long_name_len(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->long_name_len; +} + +static inline const char *dso__name(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->name; +} + +static inline enum dso_swap_type dso__needs_swap(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->needs_swap; +} + +static inline void dso__set_needs_swap(struct dso *dso, enum dso_swap_type= type) +{ + RC_CHK_ACCESS(dso)->needs_swap =3D type; +} + +static inline struct nsinfo *dso__nsinfo(struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->nsinfo; +} + +static inline const struct nsinfo *dso__nsinfo_const(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->nsinfo; +} + +static inline struct nsinfo **dso__nsinfo_ptr(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->nsinfo; +} + +void dso__set_nsinfo(struct dso *dso, struct nsinfo *nsi); + +static inline u8 dso__rel(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->rel; +} + +static inline void dso__set_rel(struct dso *dso, u8 rel) +{ + RC_CHK_ACCESS(dso)->rel =3D rel; +} + +static inline const char *dso__short_name(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->short_name; +} + +static inline bool dso__short_name_allocated(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->short_name_allocated; +} + +static inline void dso__set_short_name_allocated(struct dso *dso, bool all= ocated) +{ + RC_CHK_ACCESS(dso)->short_name_allocated =3D allocated; +} + +static inline u16 dso__short_name_len(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->short_name_len; +} + +static inline struct rb_root_cached *dso__srclines(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->srclines; +} + +static inline struct rb_root_cached *dso__symbols(struct dso *dso) +{ + return &RC_CHK_ACCESS(dso)->symbols; +} + +static inline struct symbol **dso__symbol_names(struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->symbol_names; +} + +static inline void dso__set_symbol_names(struct dso *dso, struct symbol **= names) +{ + RC_CHK_ACCESS(dso)->symbol_names =3D names; +} + +static inline size_t dso__symbol_names_len(struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->symbol_names_len; +} + +static inline void dso__set_symbol_names_len(struct dso *dso, size_t len) +{ + RC_CHK_ACCESS(dso)->symbol_names_len =3D len; +} + +static inline const char *dso__symsrc_filename(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->symsrc_filename; +} + +static inline void dso__set_symsrc_filename(struct dso *dso, char *val) +{ + RC_CHK_ACCESS(dso)->symsrc_filename =3D val; +} + +static inline enum dso_binary_type dso__symtab_type(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->symtab_type; +} + +static inline void dso__set_symtab_type(struct dso *dso, enum dso_binary_t= ype bt) +{ + RC_CHK_ACCESS(dso)->symtab_type =3D bt; +} + +static inline u64 dso__text_end(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->text_end; +} + +static inline void dso__set_text_end(struct dso *dso, u64 val) +{ + RC_CHK_ACCESS(dso)->text_end =3D val; +} + +static inline u64 dso__text_offset(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->text_offset; +} + +static inline void dso__set_text_offset(struct dso *dso, u64 val) +{ + RC_CHK_ACCESS(dso)->text_offset =3D val; } =20 int dso_id__cmp(const struct dso_id *a, const struct dso_id *b); @@ -262,7 +636,7 @@ bool dso__loaded(const struct dso *dso); =20 static inline bool dso__has_symbols(const struct dso *dso) { - return !RB_EMPTY_ROOT(&dso->symbols.rb_root); + return !RB_EMPTY_ROOT(&RC_CHK_ACCESS(dso)->symbols.rb_root); } =20 char *dso__filename_with_chroot(const struct dso *dso, const char *filenam= e); @@ -378,21 +752,33 @@ void dso__reset_find_symbol_cache(struct dso *dso); size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp); size_t dso__fprintf(struct dso *dso, FILE *fp); =20 +static inline enum dso_binary_type dso__binary_type(const struct dso *dso) +{ + return RC_CHK_ACCESS(dso)->binary_type; +} + +static inline void dso__set_binary_type(struct dso *dso, enum dso_binary_t= ype bt) +{ + RC_CHK_ACCESS(dso)->binary_type =3D bt; +} + static inline bool dso__is_vmlinux(const struct dso *dso) { - return dso->binary_type =3D=3D DSO_BINARY_TYPE__VMLINUX || - dso->binary_type =3D=3D DSO_BINARY_TYPE__GUEST_VMLINUX; + enum dso_binary_type bt =3D dso__binary_type(dso); + + return bt =3D=3D DSO_BINARY_TYPE__VMLINUX || bt =3D=3D DSO_BINARY_TYPE__G= UEST_VMLINUX; } =20 static inline bool dso__is_kcore(const struct dso *dso) { - return dso->binary_type =3D=3D DSO_BINARY_TYPE__KCORE || - dso->binary_type =3D=3D DSO_BINARY_TYPE__GUEST_KCORE; + enum dso_binary_type bt =3D dso__binary_type(dso); + + return bt =3D=3D DSO_BINARY_TYPE__KCORE || bt =3D=3D DSO_BINARY_TYPE__GUE= ST_KCORE; } =20 static inline bool dso__is_kallsyms(const struct dso *dso) { - return dso->kernel && dso->long_name[0] !=3D '/'; + return RC_CHK_ACCESS(dso)->kernel && RC_CHK_ACCESS(dso)->long_name[0] != =3D '/'; } =20 bool dso__is_object_file(const struct dso *dso); diff --git a/tools/perf/util/dsos.c b/tools/perf/util/dsos.c index 23c3fe4f2abb..ab3d0c01dd63 100644 --- a/tools/perf/util/dsos.c +++ b/tools/perf/util/dsos.c @@ -29,8 +29,8 @@ static void dsos__purge(struct dsos *dsos) for (unsigned int i =3D 0; i < dsos->cnt; i++) { struct dso *dso =3D dsos->dsos[i]; =20 + dso__set_dsos(dso, NULL); dso__put(dso); - dso->dsos =3D NULL; } =20 zfree(&dsos->dsos); @@ -73,22 +73,22 @@ static int dsos__read_build_ids_cb(struct dso *dso, voi= d *data) struct dsos__read_build_ids_cb_args *args =3D data; struct nscookie nsc; =20 - 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 =3D 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 =3D true; - dso->has_build_id =3D true; - } else if (errno =3D=3D ENOENT && dso->nsinfo) { - char *new_name =3D dso__filename_with_chroot(dso, dso->long_name); + dso__set_has_build_id(dso); + } else if (errno =3D=3D ENOENT && dso__nsinfo(dso)) { + char *new_name =3D dso__filename_with_chroot(dso, dso__long_name(dso)); =20 - 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 =3D true; - dso->has_build_id =3D true; + dso__set_has_build_id(dso); } free(new_name); } @@ -110,27 +110,27 @@ bool dsos__read_build_ids(struct dsos *dsos, bool wit= h_hits) static int __dso__cmp_long_name(const char *long_name, const struct dso_id= *id, const struct dso *b) { - int rc =3D strcmp(long_name, b->long_name); - return rc ?: dso_id__cmp(id, &b->id); + int rc =3D strcmp(long_name, dso__long_name(b)); + return rc ?: dso_id__cmp(id, dso__id_const(b)); } =20 static int __dso__cmp_short_name(const char *short_name, const struct dso_= id *id, const struct dso *b) { - int rc =3D strcmp(short_name, b->short_name); - return rc ?: dso_id__cmp(id, &b->id); + int rc =3D strcmp(short_name, dso__short_name(b)); + return rc ?: dso_id__cmp(id, dso__id_const(b)); } =20 static int dsos__cmp_long_name_id_short_name(const void *va, const void *v= b) { const struct dso *a =3D *((const struct dso **)va); const struct dso *b =3D *((const struct dso **)vb); - int rc =3D strcmp(a->long_name, b->long_name); + int rc =3D strcmp(dso__long_name(a), dso__long_name(b)); =20 if (!rc) { - rc =3D dso_id__cmp(&a->id, &b->id); + rc =3D dso_id__cmp(dso__id_const(a), dso__id_const(b)); if (!rc) - rc =3D strcmp(a->short_name, b->short_name); + rc =3D 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]) <=3D 0; } - dso->dsos =3D dsos; + dso__set_dsos(dso, dsos); return 0; } =20 @@ -275,7 +275,7 @@ static void dso__set_basename(struct dso *dso) char *base, *lname; int tid; =20 - if (sscanf(dso->long_name, "/tmp/perf-%d.map", &tid) =3D=3D 1) { + if (sscanf(dso__long_name(dso), "/tmp/perf-%d.map", &tid) =3D=3D 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 =3D strdup(dso->long_name); + lname =3D strdup(dso__long_name(dso)); if (!lname) return; =20 @@ -322,7 +322,7 @@ static struct dso *__dsos__findnew_id(struct dsos *dsos= , const char *name, struc { struct dso *dso =3D __dsos__find_id(dsos, name, id, false, /*write_locked= =3D*/true); =20 - 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); =20 return dso ? dso : __dsos__addnew_id(dsos, name, id); @@ -351,8 +351,8 @@ static int dsos__fprintf_buildid_cb(struct dso *dso, vo= id *data) =20 if (args->skip && args->skip(dso, args->parm)) return 0; - build_id__sprintf(&dso->bid, sbuild_id); - args->ret +=3D fprintf(args->fp, "%-40s %s\n", sbuild_id, dso->long_name); + build_id__sprintf(dso__bid(dso), sbuild_id); + args->ret +=3D fprintf(args->fp, "%-40s %s\n", sbuild_id, dso__long_name(= dso)); return 0; } =20 @@ -396,7 +396,7 @@ size_t dsos__fprintf(struct dsos *dsos, FILE *fp) =20 static int dsos__hit_all_cb(struct dso *dso, void *data __maybe_unused) { - dso->hit =3D true; + dso__set_hit(dso); return 0; } =20 @@ -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 =3D DSO_SPACE__KERNEL; + dso__set_kernel(dso, DSO_SPACE__KERNEL); __dsos__add(dsos, dso); =20 up_write(&dsos->lock); @@ -455,8 +455,8 @@ static int dsos__find_kernel_dso_cb(struct dso *dso, vo= id *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_UNKNOW= N)) return 0; =20 *res =3D dso__get(dso); diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 198903157f9e..f32f9abf6344 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -726,7 +726,7 @@ int machine__resolve(struct machine *machine, struct ad= dr_location *al, dso =3D al->map ? map__dso(al->map) : NULL; dump_printf(" ...... dso: %s\n", dso - ? dso->long_name + ? dso__long_name(dso) : (al->level =3D=3D 'H' ? "[hypervisor]" : "")); =20 if (thread__is_filtered(thread)) @@ -750,10 +750,10 @@ int machine__resolve(struct machine *machine, struct = addr_location *al, if (al->map) { if (symbol_conf.dso_list && (!dso || !(strlist__has_entry(symbol_conf.dso_list, - dso->short_name) || - (dso->short_name !=3D dso->long_name && + dso__short_name(dso)) || + (dso__short_name(dso) !=3D dso__long_name(dso) && strlist__has_entry(symbol_conf.dso_list, - dso->long_name))))) { + dso__long_name(dso)))))) { al->filtered |=3D (1 << HIST_FILTER__DSO); } =20 diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 54f7b7ec9cdd..da4ddc4bdc84 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -2307,7 +2307,7 @@ static int __event_process_build_id(struct perf_recor= d_header_build_id *bev, =20 build_id__init(&bid, bev->data, size); dso__set_build_id(dso, &bid); - dso->header_build_id =3D 1; + dso__set_header_build_id(dso, true); =20 if (dso_space !=3D DSO_SPACE__USER) { struct kmod_path m =3D { .name =3D NULL, }; @@ -2315,13 +2315,13 @@ static int __event_process_build_id(struct perf_rec= ord_header_build_id *bev, if (!kmod_path__parse_name(&m, filename) && m.kmod) dso__set_module_info(dso, &m, machine); =20 - dso->kernel =3D dso_space; + dso__set_kernel(dso, dso_space); free(m.name); } =20 - build_id__sprintf(&dso->bid, sbuild_id); + build_id__sprintf(dso__bid(dso), sbuild_id); pr_debug("build id event received for %s: %s [%zu]\n", - dso->long_name, sbuild_id, size); + dso__long_name(dso), sbuild_id, size); dso__put(dso); } =20 diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 0888b7163b7c..a9eef8b5aff0 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -2128,7 +2128,7 @@ static bool hists__filter_entry_by_dso(struct hists *= hists, struct hist_entry *he) { if (hists->dso_filter !=3D NULL && - (he->ms.map =3D=3D NULL || map__dso(he->ms.map) !=3D hists->dso_filte= r)) { + (he->ms.map =3D=3D NULL || !RC_CHK_EQUAL(map__dso(he->ms.map), hists-= >dso_filter))) { he->filtered |=3D (1 << HIST_FILTER__DSO); return true; } @@ -2808,7 +2808,7 @@ int __hists__scnprintf_title(struct hists *hists, cha= r *bf, size_t size, bool sh } if (dso) printed +=3D scnprintf(bf + printed, size - printed, - ", DSO: %s", dso->short_name); + ", DSO: %s", dso__short_name(dso)); if (socket_id > -1) printed +=3D scnprintf(bf + printed, size - printed, ", Processor Socket: %d", socket_id); diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c index f38893e0b036..04a291562b14 100644 --- a/tools/perf/util/intel-pt.c +++ b/tools/perf/util/intel-pt.c @@ -598,15 +598,15 @@ static struct auxtrace_cache *intel_pt_cache(struct d= so *dso, struct auxtrace_cache *c; unsigned int bits; =20 - if (dso->auxtrace_cache) - return dso->auxtrace_cache; + if (dso__auxtrace_cache(dso)) + return dso__auxtrace_cache(dso); =20 bits =3D intel_pt_cache_size(dso, machine); =20 /* Ignoring cache creation failure */ c =3D auxtrace_cache__new(bits, sizeof(struct intel_pt_cache_entry), 200); =20 - dso->auxtrace_cache =3D c; + dso__set_auxtrace_cache(dso, c); =20 return c; } @@ -650,7 +650,7 @@ intel_pt_cache_lookup(struct dso *dso, struct machine *= machine, u64 offset) if (!c) return NULL; =20 - return auxtrace_cache__lookup(dso->auxtrace_cache, offset); + return auxtrace_cache__lookup(dso__auxtrace_cache(dso), offset); } =20 static void intel_pt_cache_invalidate(struct dso *dso, struct machine *mac= hine, @@ -661,7 +661,7 @@ static void intel_pt_cache_invalidate(struct dso *dso, = struct machine *machine, if (!c) return; =20 - auxtrace_cache__remove(dso->auxtrace_cache, offset); + auxtrace_cache__remove(dso__auxtrace_cache(dso), offset); } =20 static inline bool intel_pt_guest_kernel_ip(uint64_t ip) @@ -820,8 +820,8 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn= *intel_pt_insn, } dso =3D map__dso(al.map); =20 - if (dso->data.status =3D=3D DSO_DATA_STATUS_ERROR && - dso__data_status_seen(dso, DSO_DATA_STATUS_SEEN_ITRACE)) { + if (dso__data(dso)->status =3D=3D DSO_DATA_STATUS_ERROR && + dso__data_status_seen(dso, DSO_DATA_STATUS_SEEN_ITRACE)) { ret =3D -ENOENT; goto out_ret; } @@ -854,7 +854,7 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn= *intel_pt_insn, /* Load maps to ensure dso->is_64_bit has been updated */ map__load(al.map); =20 - x86_64 =3D dso->is_64_bit; + x86_64 =3D dso__is_64_bit(dso); =20 while (1) { len =3D dso__data_read_offset(dso, machine, @@ -1008,7 +1008,7 @@ static int __intel_pt_pgd_ip(uint64_t ip, void *data) =20 offset =3D map__map_ip(al.map, ip); =20 - res =3D intel_pt_match_pgd_ip(ptq->pt, ip, offset, map__dso(al.map)->long= _name); + res =3D intel_pt_match_pgd_ip(ptq->pt, ip, offset, dso__long_name(map__ds= o(al.map))); addr_location__exit(&al); return res; } @@ -3416,7 +3416,7 @@ static int intel_pt_text_poke(struct intel_pt *pt, un= ion perf_event *event) } =20 dso =3D map__dso(al.map); - if (!dso || !dso->auxtrace_cache) + if (!dso || !dso__auxtrace_cache(dso)) continue; =20 offset =3D map__map_ip(al.map, addr); @@ -3436,7 +3436,7 @@ static int intel_pt_text_poke(struct intel_pt *pt, un= ion perf_event *event) } else { intel_pt_cache_invalidate(dso, machine, offset); intel_pt_log("Invalidated instruction cache for %s at %#"PRIx64"\n", - dso->long_name, addr); + dso__long_name(dso), addr); } } out: diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 3646d4593502..d4534fbc7098 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -694,7 +694,7 @@ static int machine__process_ksymbol_register(struct mac= hine *machine, err =3D -ENOMEM; goto out; } - dso->kernel =3D DSO_SPACE__KERNEL; + dso__set_kernel(dso, DSO_SPACE__KERNEL); map =3D map__new2(0, dso); dso__put(dso); if (!map) { @@ -702,8 +702,8 @@ static int machine__process_ksymbol_register(struct mac= hine *machine, goto out; } if (event->ksymbol.ksym_type =3D=3D PERF_RECORD_KSYMBOL_TYPE_OOL) { - dso->binary_type =3D DSO_BINARY_TYPE__OOL; - dso->data.file_size =3D event->ksymbol.len; + dso__set_binary_type(dso, DSO_BINARY_TYPE__OOL); + dso__data(dso)->file_size =3D event->ksymbol.len; dso__set_loaded(dso); } =20 @@ -718,7 +718,7 @@ static int machine__process_ksymbol_register(struct mac= hine *machine, dso__set_loaded(dso); =20 if (is_bpf_image(event->ksymbol.name)) { - dso->binary_type =3D DSO_BINARY_TYPE__BPF_IMAGE; + dso__set_binary_type(dso, DSO_BINARY_TYPE__BPF_IMAGE); dso__set_long_name(dso, "", false); } } else { @@ -888,17 +888,17 @@ size_t machine__fprintf_vmlinux_path(struct machine *= machine, FILE *fp) size_t printed =3D 0; struct dso *kdso =3D machine__kernel_dso(machine); =20 - if (kdso->has_build_id) { + if (dso__has_build_id(kdso)) { char filename[PATH_MAX]; - if (dso__build_id_filename(kdso, filename, sizeof(filename), - false)) + + if (dso__build_id_filename(kdso, filename, sizeof(filename), false)) printed +=3D fprintf(fp, "[0] %s\n", filename); } =20 - for (i =3D 0; i < vmlinux_path__nr_entries; ++i) - printed +=3D fprintf(fp, "[%d] %s\n", - i + kdso->has_build_id, vmlinux_path[i]); - + for (i =3D 0; i < vmlinux_path__nr_entries; ++i) { + printed +=3D fprintf(fp, "[%d] %s\n", i + dso__has_build_id(kdso), + vmlinux_path[i]); + } return printed; } =20 @@ -948,7 +948,7 @@ static struct dso *machine__get_kernel(struct machine *= machine) DSO_SPACE__KERNEL_GUEST); } =20 - if (kernel !=3D NULL && (!kernel->has_build_id)) + if (kernel !=3D NULL && (!dso__has_build_id(kernel))) dso__read_running_kernel_build_id(kernel, machine); =20 return kernel; @@ -1313,8 +1313,8 @@ static char *get_kernel_version(const char *root_dir) =20 static bool is_kmod_dso(struct dso *dso) { - return dso->symtab_type =3D=3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE || - dso->symtab_type =3D=3D DSO_BINARY_TYPE__GUEST_KMODULE; + return dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE = || + dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__GUEST_KMODULE; } =20 static int maps__set_module_path(struct maps *maps, const char *path, stru= ct kmod_path *m) @@ -1341,8 +1341,8 @@ static int maps__set_module_path(struct maps *maps, c= onst char *path, struct kmo * we need to update the symtab_type if needed. */ if (m->comp && is_kmod_dso(dso)) { - dso->symtab_type++; - dso->comp =3D m->comp; + dso__set_symtab_type(dso, dso__symtab_type(dso)); + dso__set_comp(dso, m->comp); } map__put(map); return 0; @@ -1639,13 +1639,13 @@ static int machine__process_kernel_mmap_event(struc= t machine *machine, if (kernel =3D=3D NULL) goto out_problem; =20 - kernel->kernel =3D dso_space; + dso__set_kernel(kernel, dso_space); if (__machine__create_kernel_maps(machine, kernel) < 0) { dso__put(kernel); goto out_problem; } =20 - if (strstr(kernel->long_name, "vmlinux")) + if (strstr(dso__long_name(kernel), "vmlinux")) dso__set_short_name(kernel, "[kernel.vmlinux]", false); =20 if (machine__update_kernel_mmap(machine, xm->start, xm->end) < 0) { @@ -2027,14 +2027,14 @@ static char *callchain_srcline(struct map_symbol *m= s, u64 ip) return srcline; =20 dso =3D map__dso(map); - srcline =3D srcline__tree_find(&dso->srclines, ip); + srcline =3D srcline__tree_find(dso__srclines(dso), ip); if (!srcline) { bool show_sym =3D false; bool show_addr =3D callchain_param.key =3D=3D CCKEY_ADDRESS; =20 srcline =3D get_srcline(dso, map__rip_2objdump(map, ip), ms->sym, show_sym, show_addr, ip); - srcline__tree_insert(&dso->srclines, ip, srcline); + srcline__tree_insert(dso__srclines(dso), ip, srcline); } =20 return srcline; @@ -2832,12 +2832,12 @@ static int append_inlines(struct callchain_cursor *= cursor, struct map_symbol *ms addr =3D map__rip_2objdump(map, addr); dso =3D map__dso(map); =20 - inline_node =3D inlines__tree_find(&dso->inlined_nodes, addr); + inline_node =3D inlines__tree_find(dso__inlined_nodes(dso), addr); if (!inline_node) { inline_node =3D dso__parse_addr_inlines(dso, addr, sym); if (!inline_node) return ret; - inlines__tree_insert(&dso->inlined_nodes, inline_node); + inlines__tree_insert(dso__inlined_nodes(dso), inline_node); } =20 ilist_ms =3D (struct map_symbol) { @@ -3126,7 +3126,7 @@ char *machine__resolve_kernel_addr(void *vmachine, un= signed long long *addrp, ch if (sym =3D=3D NULL) return NULL; =20 - *modp =3D __map__is_kmodule(map) ? (char *)map__dso(map)->short_name : NU= LL; + *modp =3D __map__is_kmodule(map) ? (char *)dso__short_name(map__dso(map))= : NULL; *addrp =3D map__unmap_ip(map, sym->start); return sym->name; } diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 7c1fff9e413d..14fb8cf65b13 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -168,7 +168,7 @@ struct map *map__new(struct machine *machine, u64 start= , u64 len, if (dso =3D=3D NULL) goto out_delete; =20 - assert(!dso->kernel); + assert(!dso__kernel(dso)); map__init(result, start, start + len, pgoff, dso); =20 if (anon || no_dso) { @@ -182,10 +182,9 @@ struct map *map__new(struct machine *machine, u64 star= t, u64 len, if (!(prot & PROT_EXEC)) dso__set_loaded(dso); } - mutex_lock(&dso->lock); - nsinfo__put(dso->nsinfo); - dso->nsinfo =3D nsi; - mutex_unlock(&dso->lock); + mutex_lock(dso__lock(dso)); + dso__set_nsinfo(dso, nsi); + mutex_unlock(dso__lock(dso)); =20 if (build_id__is_defined(bid)) { dso__set_build_id(dso, bid); @@ -197,9 +196,9 @@ struct map *map__new(struct machine *machine, u64 start= , u64 len, * have it missing. */ header_bid_dso =3D dsos__find(&machine->dsos, filename, false); - if (header_bid_dso && header_bid_dso->header_build_id) { - dso__set_build_id(dso, &header_bid_dso->bid); - dso->header_build_id =3D 1; + if (header_bid_dso && dso__header_build_id(header_bid_dso)) { + dso__set_build_id(dso, dso__bid(header_bid_dso)); + dso__set_header_build_id(dso, 1); } } dso__put(dso); @@ -221,7 +220,7 @@ struct map *map__new2(u64 start, struct dso *dso) struct map *result; RC_STRUCT(map) *map; =20 - map =3D calloc(1, sizeof(*map) + (dso->kernel ? sizeof(struct kmap) : 0)); + map =3D calloc(1, sizeof(*map) + (dso__kernel(dso) ? sizeof(struct kmap) = : 0)); if (ADD_RC_CHK(result, map)) { /* * ->end will be filled after we load all the symbols @@ -234,7 +233,7 @@ struct map *map__new2(u64 start, struct dso *dso) =20 bool __map__is_kernel(const struct map *map) { - if (!map__dso(map)->kernel) + if (!dso__kernel(map__dso(map))) return false; return machine__kernel_map(maps__machine(map__kmaps((struct map *)map))) = =3D=3D map; } @@ -251,7 +250,7 @@ bool __map__is_bpf_prog(const struct map *map) const char *name; struct dso *dso =3D map__dso(map); =20 - if (dso->binary_type =3D=3D DSO_BINARY_TYPE__BPF_PROG_INFO) + if (dso__binary_type(dso) =3D=3D DSO_BINARY_TYPE__BPF_PROG_INFO) return true; =20 /* @@ -259,7 +258,7 @@ bool __map__is_bpf_prog(const struct map *map) * type of DSO_BINARY_TYPE__BPF_PROG_INFO. In such cases, we can * guess the type based on name. */ - name =3D dso->short_name; + name =3D dso__short_name(dso); return name && (strstr(name, "bpf_prog_") =3D=3D name); } =20 @@ -268,7 +267,7 @@ bool __map__is_bpf_image(const struct map *map) const char *name; struct dso *dso =3D map__dso(map); =20 - if (dso->binary_type =3D=3D DSO_BINARY_TYPE__BPF_IMAGE) + if (dso__binary_type(dso) =3D=3D DSO_BINARY_TYPE__BPF_IMAGE) return true; =20 /* @@ -276,7 +275,7 @@ bool __map__is_bpf_image(const struct map *map) * type of DSO_BINARY_TYPE__BPF_IMAGE. In such cases, we can * guess the type based on name. */ - name =3D dso->short_name; + name =3D dso__short_name(dso); return name && is_bpf_image(name); } =20 @@ -284,7 +283,7 @@ bool __map__is_ool(const struct map *map) { const struct dso *dso =3D map__dso(map); =20 - return dso && dso->binary_type =3D=3D DSO_BINARY_TYPE__OOL; + return dso && dso__binary_type(dso) =3D=3D DSO_BINARY_TYPE__OOL; } =20 bool map__has_symbols(const struct map *map) @@ -315,7 +314,7 @@ void map__put(struct map *map) void map__fixup_start(struct map *map) { struct dso *dso =3D map__dso(map); - struct rb_root_cached *symbols =3D &dso->symbols; + struct rb_root_cached *symbols =3D dso__symbols(dso); struct rb_node *nd =3D rb_first_cached(symbols); =20 if (nd !=3D NULL) { @@ -328,7 +327,7 @@ void map__fixup_start(struct map *map) void map__fixup_end(struct map *map) { struct dso *dso =3D map__dso(map); - struct rb_root_cached *symbols =3D &dso->symbols; + struct rb_root_cached *symbols =3D dso__symbols(dso); struct rb_node *nd =3D rb_last(&symbols->rb_root); =20 if (nd !=3D NULL) { @@ -342,7 +341,7 @@ void map__fixup_end(struct map *map) int map__load(struct map *map) { struct dso *dso =3D map__dso(map); - const char *name =3D dso->long_name; + const char *name =3D dso__long_name(dso); int nr; =20 if (dso__loaded(dso)) @@ -350,10 +349,10 @@ int map__load(struct map *map) =20 nr =3D dso__load(dso, map); if (nr < 0) { - if (dso->has_build_id) { + if (dso__has_build_id(dso)) { char sbuild_id[SBUILD_ID_SIZE]; =20 - build_id__sprintf(&dso->bid, sbuild_id); + build_id__sprintf(dso__bid(dso), sbuild_id); pr_debug("%s with build id %s not found", name, sbuild_id); } else pr_debug("Failed to open %s", name); @@ -415,7 +414,7 @@ struct map *map__clone(struct map *from) size_t size =3D sizeof(RC_STRUCT(map)); struct dso *dso =3D map__dso(from); =20 - if (dso && dso->kernel) + if (dso && dso__kernel(dso)) size +=3D sizeof(struct kmap); =20 map =3D memdup(RC_CHK_ACCESS(from), size); @@ -432,14 +431,14 @@ size_t map__fprintf(struct map *map, FILE *fp) const struct dso *dso =3D map__dso(map); =20 return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s\n", - map__start(map), map__end(map), map__pgoff(map), dso->name); + map__start(map), map__end(map), map__pgoff(map), dso__name(dso)); } =20 static bool prefer_dso_long_name(const struct dso *dso, bool print_off) { - return dso->long_name && + return dso__long_name(dso) && (symbol_conf.show_kernel_path || - (print_off && (dso->name[0] =3D=3D '[' || dso__is_kcore(dso)))); + (print_off && (dso__name(dso)[0] =3D=3D '[' || dso__is_kcore(dso)))); } =20 static size_t __map__fprintf_dsoname(struct map *map, bool print_off, FILE= *fp) @@ -450,9 +449,9 @@ static size_t __map__fprintf_dsoname(struct map *map, b= ool print_off, FILE *fp) =20 if (dso) { if (prefer_dso_long_name(dso, print_off)) - dsoname =3D dso->long_name; + dsoname =3D dso__long_name(dso); else - dsoname =3D dso->name; + dsoname =3D dso__name(dso); } =20 if (symbol_conf.pad_output_len_dso) { @@ -545,18 +544,18 @@ u64 map__rip_2objdump(struct map *map, u64 rip) } } =20 - if (!dso->adjust_symbols) + if (!dso__adjust_symbols(dso)) return rip; =20 - if (dso->rel) + if (dso__rel(dso)) return rip - map__pgoff(map); =20 /* * kernel modules also have DSO_TYPE_USER in dso->kernel, * but all kernel modules are ET_REL, so won't get here. */ - if (dso->kernel =3D=3D DSO_SPACE__USER) - return rip + dso->text_offset; + if (dso__kernel(dso) =3D=3D DSO_SPACE__USER) + return rip + dso__text_offset(dso); =20 return map__unmap_ip(map, rip) - map__reloc(map); } @@ -577,18 +576,18 @@ u64 map__objdump_2mem(struct map *map, u64 ip) { const struct dso *dso =3D map__dso(map); =20 - if (!dso->adjust_symbols) + if (!dso__adjust_symbols(dso)) return map__unmap_ip(map, ip); =20 - if (dso->rel) + if (dso__rel(dso)) return map__unmap_ip(map, ip + map__pgoff(map)); =20 /* * kernel modules also have DSO_TYPE_USER in dso->kernel, * but all kernel modules are ET_REL, so won't get here. */ - if (dso->kernel =3D=3D DSO_SPACE__USER) - return map__unmap_ip(map, ip - dso->text_offset); + if (dso__kernel(dso) =3D=3D DSO_SPACE__USER) + return map__unmap_ip(map, ip - dso__text_offset(dso)); =20 return ip + map__reloc(map); } @@ -604,7 +603,7 @@ struct kmap *__map__kmap(struct map *map) { const struct dso *dso =3D map__dso(map); =20 - if (!dso || !dso->kernel) + if (!dso || !dso__kernel(dso)) return NULL; return (struct kmap *)(&RC_CHK_ACCESS(map)[1]); } diff --git a/tools/perf/util/maps.c b/tools/perf/util/maps.c index 725f5d73e93a..a4a73a5d857a 100644 --- a/tools/perf/util/maps.c +++ b/tools/perf/util/maps.c @@ -76,7 +76,7 @@ static void check_invariants(const struct maps *maps __ma= ybe_unused) /* Expect at least 1 reference count. */ assert(refcount_read(map__refcnt(map)) > 0); =20 - if (map__dso(map) && map__dso(map)->kernel) + if (map__dso(map) && dso__kernel(map__dso(map))) assert(RC_CHK_EQUAL(map__kmap(map)->kmaps, maps)); =20 if (i > 0) { @@ -331,7 +331,7 @@ static int map__strcmp(const void *a, const void *b) const struct map *map_b =3D *(const struct map * const *)b; const struct dso *dso_a =3D map__dso(map_a); const struct dso *dso_b =3D map__dso(map_b); - int ret =3D strcmp(dso_a->short_name, dso_b->short_name); + int ret =3D strcmp(dso__short_name(dso_a), dso__short_name(dso_b)); =20 if (ret =3D=3D 0 && RC_CHK_ACCESS(map_a) !=3D RC_CHK_ACCESS(map_b)) { /* Ensure distinct but name equal maps have an order. */ @@ -470,7 +470,7 @@ static int __maps__insert(struct maps *maps, struct map= *new) } if (map__end(new) < map__start(new)) RC_CHK_ACCESS(maps)->ends_broken =3D true; - if (dso && dso->kernel) { + if (dso && dso__kernel(dso)) { struct kmap *kmap =3D map__kmap(new); =20 if (kmap) @@ -746,7 +746,7 @@ static int __maps__fixup_overlap_and_insert(struct maps= *maps, struct map *new) =20 if (use_browser) { pr_debug("overlapping maps in %s (disable tui for more info)\n", - map__dso(new)->name); + dso__name(map__dso(new))); } else if (verbose >=3D 2) { pr_debug("overlapping maps:\n"); map__fprintf(new, debug_file()); @@ -967,7 +967,7 @@ static int map__strcmp_name(const void *name, const voi= d *b) { const struct dso *dso =3D map__dso(*(const struct map **)b); =20 - return strcmp(name, dso->short_name); + return strcmp(name, dso__short_name(dso)); } =20 struct map *maps__find_by_name(struct maps *maps, const char *name) @@ -986,7 +986,7 @@ struct map *maps__find_by_name(struct maps *maps, const= char *name) if (i < maps__nr_maps(maps) && maps__maps_by_name(maps)) { struct dso *dso =3D map__dso(maps__maps_by_name(maps)[i]); =20 - if (dso && strcmp(dso->short_name, name) =3D=3D 0) { + if (dso && strcmp(dso__short_name(dso), name) =3D=3D 0) { result =3D map__get(maps__maps_by_name(maps)[i]); done =3D true; } @@ -1023,7 +1023,7 @@ struct map *maps__find_by_name(struct maps *maps, con= st char *name) struct map *pos =3D maps_by_address[i]; struct dso *dso =3D map__dso(pos); =20 - if (dso && strcmp(dso->short_name, name) =3D=3D 0) { + if (dso && strcmp(dso__short_name(dso), name) =3D=3D 0) { result =3D map__get(pos); break; } diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index be71abe8b9b0..26c084b4a4a6 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -158,8 +158,8 @@ static int kernel_get_module_map_cb(struct map *map, vo= id *data) { struct kernel_get_module_map_cb_args *args =3D data; struct dso *dso =3D map__dso(map); - const char *short_name =3D dso->short_name; /* short_name is "[module]" */ - u16 short_name_len =3D dso->short_name_len; + const char *short_name =3D dso__short_name(dso); + u16 short_name_len =3D dso__short_name_len(dso); =20 if (strncmp(short_name + 1, args->module, short_name_len - 2) =3D=3D 0 && args->module[short_name_len - 2] =3D=3D '\0') { @@ -201,10 +201,9 @@ struct map *get_target_map(const char *target, struct = nsinfo *nsi, bool user) map =3D dso__new_map(target); dso =3D map ? map__dso(map) : NULL; if (dso) { - mutex_lock(&dso->lock); - nsinfo__put(dso->nsinfo); - dso->nsinfo =3D nsinfo__get(nsi); - mutex_unlock(&dso->lock); + mutex_lock(dso__lock(dso)); + dso__set_nsinfo(dso, nsinfo__get(nsi)); + mutex_unlock(dso__lock(dso)); } return map; } else { @@ -367,11 +366,11 @@ static int kernel_get_module_dso(const char *module, = struct dso **pdso) =20 map =3D machine__kernel_map(host_machine); dso =3D map__dso(map); - if (!dso->has_build_id) + if (!dso__has_build_id(dso)) dso__read_running_kernel_build_id(dso, host_machine); =20 vmlinux_name =3D symbol_conf.vmlinux_name; - dso->load_errno =3D 0; + *dso__load_errno(dso) =3D 0; if (vmlinux_name) ret =3D dso__load_vmlinux(dso, map, vmlinux_name, false); else @@ -498,7 +497,7 @@ static struct debuginfo *open_from_debuginfod(struct ds= o *dso, struct nsinfo *ns if (!c) return NULL; =20 - build_id__sprintf(&dso->bid, sbuild_id); + build_id__sprintf(dso__bid(dso), sbuild_id); fd =3D debuginfod_find_debuginfo(c, (const unsigned char *)sbuild_id, 0, &path); if (fd >=3D 0) @@ -541,7 +540,7 @@ static struct debuginfo *open_debuginfo(const char *mod= ule, struct nsinfo *nsi, if (!module || !strchr(module, '/')) { err =3D kernel_get_module_dso(module, &dso); if (err < 0) { - if (!dso || dso->load_errno =3D=3D 0) { + if (!dso || *dso__load_errno(dso) =3D=3D 0) { if (!str_error_r(-err, reason, STRERR_BUFSIZE)) strcpy(reason, "(unknown)"); } else @@ -558,7 +557,7 @@ static struct debuginfo *open_debuginfo(const char *mod= ule, struct nsinfo *nsi, } return NULL; } - path =3D dso->long_name; + path =3D dso__long_name(dso); } nsinfo__mountns_enter(nsi, &nsc); ret =3D debuginfo__new(path); @@ -3796,8 +3795,8 @@ int show_available_funcs(const char *target, struct n= sinfo *nsi, /* Show all (filtered) symbols */ setup_pager(); =20 - for (size_t i =3D 0; i < dso->symbol_names_len; i++) { - struct symbol *pos =3D dso->symbol_names[i]; + for (size_t i =3D 0; i < dso__symbol_names_len(dso); i++) { + struct symbol *pos =3D dso__symbol_names(dso)[i]; =20 if (strfilter__compare(_filter, pos->name)) printf("%s\n", pos->name); diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools= /perf/util/scripting-engines/trace-event-python.c index 860e1837ba96..9cc2372c93c3 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -393,10 +393,10 @@ static const char *get_dsoname(struct map *map) struct dso *dso =3D map ? map__dso(map) : NULL; =20 if (dso) { - if (symbol_conf.show_kernel_path && dso->long_name) - dsoname =3D dso->long_name; + if (symbol_conf.show_kernel_path && dso__long_name(dso)) + dsoname =3D dso__long_name(dso); else - dsoname =3D dso->name; + dsoname =3D dso__name(dso); } =20 return dsoname; @@ -799,8 +799,9 @@ static void set_sym_in_dict(PyObject *dict, struct addr= _location *al, if (al->map) { struct dso *dso =3D map__dso(al->map); =20 - pydict_set_item_string_decref(dict, dso_field, _PyUnicode_FromString(dso= ->name)); - build_id__sprintf(&dso->bid, sbuild_id); + pydict_set_item_string_decref(dict, dso_field, + _PyUnicode_FromString(dso__name(dso))); + build_id__sprintf(dso__bid(dso), sbuild_id); pydict_set_item_string_decref(dict, dso_bid_field, _PyUnicode_FromString(sbuild_id)); pydict_set_item_string_decref(dict, dso_map_start, @@ -1242,14 +1243,14 @@ static int python_export_dso(struct db_export *dbe,= struct dso *dso, char sbuild_id[SBUILD_ID_SIZE]; PyObject *t; =20 - build_id__sprintf(&dso->bid, sbuild_id); + build_id__sprintf(dso__bid(dso), sbuild_id); =20 t =3D tuple_new(5); =20 - tuple_set_d64(t, 0, dso->db_id); + tuple_set_d64(t, 0, dso__db_id(dso)); tuple_set_d64(t, 1, machine->db_id); - tuple_set_string(t, 2, dso->short_name); - tuple_set_string(t, 3, dso->long_name); + tuple_set_string(t, 2, dso__short_name(dso)); + tuple_set_string(t, 3, dso__long_name(dso)); tuple_set_string(t, 4, sbuild_id); =20 call_object(tables->dso_handler, t, "dso_table"); @@ -1269,7 +1270,7 @@ static int python_export_symbol(struct db_export *dbe= , struct symbol *sym, t =3D tuple_new(6); =20 tuple_set_d64(t, 0, *sym_db_id); - tuple_set_d64(t, 1, dso->db_id); + tuple_set_d64(t, 1, dso__db_id(dso)); tuple_set_d64(t, 2, sym->start); tuple_set_d64(t, 3, sym->end); tuple_set_s32(t, 4, sym->binding); diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 27b123ccd2d1..34aac91b08ea 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -238,11 +238,11 @@ static int64_t _sort__dso_cmp(struct map *map_l, stru= ct map *map_r) return cmp_null(dso_r, dso_l); =20 if (verbose > 0) { - dso_name_l =3D dso_l->long_name; - dso_name_r =3D dso_r->long_name; + dso_name_l =3D dso__long_name(dso_l); + dso_name_r =3D dso__long_name(dso_r); } else { - dso_name_l =3D dso_l->short_name; - dso_name_r =3D dso_r->short_name; + dso_name_l =3D dso__short_name(dso_l); + dso_name_r =3D dso__short_name(dso_r); } =20 return strcmp(dso_name_l, dso_name_r); @@ -261,7 +261,7 @@ static int _hist_entry__dso_snprintf(struct map *map, c= har *bf, const char *dso_name =3D "[unknown]"; =20 if (dso) - dso_name =3D verbose > 0 ? dso->long_name : dso->short_name; + dso_name =3D verbose > 0 ? dso__long_name(dso) : dso__short_name(dso); =20 return repsep_snprintf(bf, size, "%-*.*s", width, width, dso_name); } @@ -363,7 +363,7 @@ static int _hist_entry__sym_snprintf(struct map_symbol = *ms, char o =3D dso ? dso__symtab_origin(dso) : '!'; u64 rip =3D ip; =20 - if (dso && dso->kernel && dso->adjust_symbols) + if (dso && dso__kernel(dso) && dso__adjust_symbols(dso)) rip =3D map__unmap_ip(map, ip); =20 ret +=3D repsep_snprintf(bf, size, "%-#*llx %c ", @@ -1539,8 +1539,8 @@ sort__dcacheline_cmp(struct hist_entry *left, struct = hist_entry *right) */ =20 if ((left->cpumode !=3D PERF_RECORD_MISC_KERNEL) && - (!(map__flags(l_map) & MAP_SHARED)) && !l_dso->id.maj && !l_dso->id.m= in && - !l_dso->id.ino && !l_dso->id.ino_generation) { + (!(map__flags(l_map) & MAP_SHARED)) && !dso__id(l_dso)->maj && !dso__= id(l_dso)->min && + !dso__id(l_dso)->ino && !dso__id(l_dso)->ino_generation) { /* userspace anonymous */ =20 if (thread__pid(left->thread) > thread__pid(right->thread)) @@ -1579,7 +1579,8 @@ static int hist_entry__dcacheline_snprintf(struct his= t_entry *he, char *bf, if ((he->cpumode !=3D PERF_RECORD_MISC_KERNEL) && map && !(map__prot(map) & PROT_EXEC) && (map__flags(map) & MAP_SHARED) && - (dso->id.maj || dso->id.min || dso->id.ino || dso->id.ino_generation= )) + (dso__id(dso)->maj || dso__id(dso)->min || dso__id(dso)->ino || + dso__id(dso)->ino_generation)) level =3D 's'; else if (!map) level =3D 'X'; diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index 034b496df297..7a56b8b0792a 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -27,14 +27,14 @@ bool srcline_full_filename; =20 char *srcline__unknown =3D (char *)"??:0"; =20 -static const char *dso__name(struct dso *dso) +static const char *srcline_dso_name(struct dso *dso) { const char *dso_name; =20 - if (dso->symsrc_filename) - dso_name =3D dso->symsrc_filename; + if (dso__symsrc_filename(dso)) + dso_name =3D dso__symsrc_filename(dso); else - dso_name =3D dso->long_name; + dso_name =3D dso__long_name(dso); =20 if (dso_name[0] =3D=3D '[') return NULL; @@ -636,7 +636,7 @@ static int addr2line(const char *dso_name, u64 addr, struct inline_node *node, struct symbol *sym __maybe_unused) { - struct child_process *a2l =3D dso->a2l; + struct child_process *a2l =3D dso__a2l(dso); char *record_function =3D NULL; char *record_filename =3D NULL; unsigned int record_line_nr =3D 0; @@ -653,8 +653,9 @@ static int addr2line(const char *dso_name, u64 addr, if (!filename__has_section(dso_name, ".debug_line")) goto out; =20 - dso->a2l =3D addr2line_subprocess_init(symbol_conf.addr2line_path, dso_n= ame); - a2l =3D dso->a2l; + dso__set_a2l(dso, + addr2line_subprocess_init(symbol_conf.addr2line_path, dso_name)); + a2l =3D dso__a2l(dso); } =20 if (a2l =3D=3D NULL) { @@ -768,7 +769,7 @@ static int addr2line(const char *dso_name, u64 addr, free(record_function); free(record_filename); if (io.eof) { - dso->a2l =3D NULL; + dso__set_a2l(dso, NULL); addr2line_subprocess_cleanup(a2l); } return ret; @@ -776,14 +777,14 @@ static int addr2line(const char *dso_name, u64 addr, =20 void dso__free_a2l(struct dso *dso) { - struct child_process *a2l =3D dso->a2l; + struct child_process *a2l =3D dso__a2l(dso); =20 if (!a2l) return; =20 addr2line_subprocess_cleanup(a2l); =20 - dso->a2l =3D NULL; + dso__set_a2l(dso, NULL); } =20 #endif /* HAVE_LIBBFD_SUPPORT */ @@ -821,33 +822,34 @@ char *__get_srcline(struct dso *dso, u64 addr, struct= symbol *sym, char *srcline; const char *dso_name; =20 - if (!dso->has_srcline) + if (!dso__has_srcline(dso)) goto out; =20 - dso_name =3D dso__name(dso); + dso_name =3D srcline_dso_name(dso); if (dso_name =3D=3D NULL) - goto out; + goto out_err; =20 if (!addr2line(dso_name, addr, &file, &line, dso, unwind_inlines, NULL, sym)) - goto out; + goto out_err; =20 srcline =3D srcline_from_fileline(file, line); free(file); =20 if (!srcline) - goto out; + goto out_err; =20 - dso->a2l_fails =3D 0; + dso__set_a2l_fails(dso, 0); =20 return srcline; =20 -out: - if (dso->a2l_fails && ++dso->a2l_fails > A2L_FAIL_LIMIT) { - dso->has_srcline =3D 0; +out_err: + dso__set_a2l_fails(dso, dso__a2l_fails(dso) + 1); + if (dso__a2l_fails(dso) > A2L_FAIL_LIMIT) { + dso__set_has_srcline(dso, false); dso__free_a2l(dso); } - +out: if (!show_addr) return (show_sym && sym) ? strndup(sym->name, sym->namelen) : SRCLINE_UNKNOWN; @@ -856,7 +858,7 @@ char *__get_srcline(struct dso *dso, u64 addr, struct s= ymbol *sym, if (asprintf(&srcline, "%s+%" PRIu64, show_sym ? sym->name : "", ip - sym->start) < 0) return SRCLINE_UNKNOWN; - } else if (asprintf(&srcline, "%s[%" PRIx64 "]", dso->short_name, addr) <= 0) + } else if (asprintf(&srcline, "%s[%" PRIx64 "]", dso__short_name(dso), ad= dr) < 0) return SRCLINE_UNKNOWN; return srcline; } @@ -867,22 +869,23 @@ char *get_srcline_split(struct dso *dso, u64 addr, un= signed *line) char *file =3D NULL; const char *dso_name; =20 - if (!dso->has_srcline) - goto out; + if (!dso__has_srcline(dso)) + return NULL; =20 - dso_name =3D dso__name(dso); + dso_name =3D srcline_dso_name(dso); if (dso_name =3D=3D NULL) - goto out; + goto out_err; =20 if (!addr2line(dso_name, addr, &file, line, dso, true, NULL, NULL)) - goto out; + goto out_err; =20 - dso->a2l_fails =3D 0; + dso__set_a2l_fails(dso, 0); return file; =20 -out: - if (dso->a2l_fails && ++dso->a2l_fails > A2L_FAIL_LIMIT) { - dso->has_srcline =3D 0; +out_err: + dso__set_a2l_fails(dso, dso__a2l_fails(dso) + 1); + if (dso__a2l_fails(dso) > A2L_FAIL_LIMIT) { + dso__set_has_srcline(dso, false); dso__free_a2l(dso); } =20 @@ -980,7 +983,7 @@ struct inline_node *dso__parse_addr_inlines(struct dso = *dso, u64 addr, { const char *dso_name; =20 - dso_name =3D dso__name(dso); + dso_name =3D srcline_dso_name(dso); if (dso_name =3D=3D NULL) return NULL; =20 diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index 5990e3fabdb5..de73f9fb3fe4 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c @@ -311,8 +311,8 @@ static char *demangle_sym(struct dso *dso, int kmodule,= const char *elf_name) * DWARF DW_compile_unit has this, but we don't always have access * to it... */ - if (!want_demangle(dso->kernel || kmodule)) - return demangled; + if (!want_demangle(dso__kernel(dso) || kmodule)) + return demangled; =20 demangled =3D cxx_demangle_sym(elf_name, verbose > 0, verbose > 0); if (demangled =3D=3D NULL) { @@ -469,7 +469,7 @@ static bool get_plt_sizes(struct dso *dso, GElf_Ehdr *e= hdr, GElf_Shdr *shdr_plt, } if (*plt_entry_size) return true; - pr_debug("Missing PLT entry size for %s\n", dso->long_name); + pr_debug("Missing PLT entry size for %s\n", dso__long_name(dso)); return false; } =20 @@ -653,7 +653,7 @@ static int dso__synthesize_plt_got_symbols(struct dso *= dso, Elf *elf, sym =3D symbol__new(shdr.sh_offset + i, shdr.sh_entsize, STB_GLOBAL, STT= _FUNC, buf); if (!sym) goto out; - symbols__insert(&dso->symbols, sym); + symbols__insert(dso__symbols(dso), sym); } err =3D 0; out: @@ -707,7 +707,7 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct= symsrc *ss) plt_sym =3D symbol__new(shdr_plt.sh_offset, plt_header_size, STB_GLOBAL, = STT_FUNC, ".plt"); if (!plt_sym) goto out_elf_end; - symbols__insert(&dso->symbols, plt_sym); + symbols__insert(dso__symbols(dso), plt_sym); =20 /* Only x86 has .plt.got */ if (machine_is_x86(ehdr.e_machine) && @@ -829,7 +829,7 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct= symsrc *ss) goto out_elf_end; =20 plt_offset +=3D plt_entry_size; - symbols__insert(&dso->symbols, f); + symbols__insert(dso__symbols(dso), f); ++nr; } =20 @@ -839,7 +839,7 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct= symsrc *ss) if (err =3D=3D 0) return nr; pr_debug("%s: problems reading %s PLT info.\n", - __func__, dso->long_name); + __func__, dso__long_name(dso)); return 0; } =20 @@ -1174,19 +1174,19 @@ static int dso__swap_init(struct dso *dso, unsigned= char eidata) { static unsigned int const endian =3D 1; =20 - dso->needs_swap =3D DSO_SWAP__NO; + dso__set_needs_swap(dso, DSO_SWAP__NO); =20 switch (eidata) { case ELFDATA2LSB: /* We are big endian, DSO is little endian. */ if (*(unsigned char const *)&endian !=3D 1) - dso->needs_swap =3D DSO_SWAP__YES; + dso__set_needs_swap(dso, DSO_SWAP__YES); break; =20 case ELFDATA2MSB: /* We are little endian, DSO is big endian. */ if (*(unsigned char const *)&endian !=3D 0) - dso->needs_swap =3D DSO_SWAP__YES; + dso__set_needs_swap(dso, DSO_SWAP__YES); break; =20 default: @@ -1237,11 +1237,11 @@ int symsrc__init(struct symsrc *ss, struct dso *dso= , const char *name, if (fd < 0) return -1; =20 - type =3D dso->symtab_type; + type =3D dso__symtab_type(dso); } else { fd =3D open(name, O_RDONLY); if (fd < 0) { - dso->load_errno =3D errno; + *dso__load_errno(dso) =3D errno; return -1; } } @@ -1249,37 +1249,37 @@ int symsrc__init(struct symsrc *ss, struct dso *dso= , const char *name, elf =3D elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL); if (elf =3D=3D NULL) { pr_debug("%s: cannot read %s ELF file.\n", __func__, name); - dso->load_errno =3D DSO_LOAD_ERRNO__INVALID_ELF; + *dso__load_errno(dso) =3D DSO_LOAD_ERRNO__INVALID_ELF; goto out_close; } =20 if (gelf_getehdr(elf, &ehdr) =3D=3D NULL) { - dso->load_errno =3D DSO_LOAD_ERRNO__INVALID_ELF; + *dso__load_errno(dso) =3D DSO_LOAD_ERRNO__INVALID_ELF; pr_debug("%s: cannot get elf header.\n", __func__); goto out_elf_end; } =20 if (dso__swap_init(dso, ehdr.e_ident[EI_DATA])) { - dso->load_errno =3D DSO_LOAD_ERRNO__INTERNAL_ERROR; + *dso__load_errno(dso) =3D DSO_LOAD_ERRNO__INTERNAL_ERROR; goto out_elf_end; } =20 /* Always reject images with a mismatched build-id: */ - if (dso->has_build_id && !symbol_conf.ignore_vmlinux_buildid) { + if (dso__has_build_id(dso) && !symbol_conf.ignore_vmlinux_buildid) { u8 build_id[BUILD_ID_SIZE]; struct build_id bid; int size; =20 size =3D elf_read_build_id(elf, build_id, BUILD_ID_SIZE); if (size <=3D 0) { - dso->load_errno =3D DSO_LOAD_ERRNO__CANNOT_READ_BUILDID; + *dso__load_errno(dso) =3D DSO_LOAD_ERRNO__CANNOT_READ_BUILDID; goto out_elf_end; } =20 build_id__init(&bid, build_id, size); if (!dso__build_id_equal(dso, &bid)) { pr_debug("%s: build id mismatch for %s.\n", __func__, name); - dso->load_errno =3D DSO_LOAD_ERRNO__MISMATCHING_BUILDID; + *dso__load_errno(dso) =3D DSO_LOAD_ERRNO__MISMATCHING_BUILDID; goto out_elf_end; } } @@ -1304,14 +1304,14 @@ int symsrc__init(struct symsrc *ss, struct dso *dso= , const char *name, if (ss->opdshdr.sh_type !=3D SHT_PROGBITS) ss->opdsec =3D NULL; =20 - if (dso->kernel =3D=3D DSO_SPACE__USER) + if (dso__kernel(dso) =3D=3D DSO_SPACE__USER) ss->adjust_symbols =3D true; else ss->adjust_symbols =3D elf__needs_adjust_symbols(ehdr); =20 ss->name =3D strdup(name); if (!ss->name) { - dso->load_errno =3D errno; + *dso__load_errno(dso) =3D errno; goto out_elf_end; } =20 @@ -1378,7 +1378,7 @@ static int dso__process_kernel_symbol(struct dso *dso= , struct map *map, if (adjust_kernel_syms) sym->st_value -=3D shdr->sh_addr - shdr->sh_offset; =20 - if (strcmp(section_name, (curr_dso->short_name + dso->short_name_len)) = =3D=3D 0) + if (strcmp(section_name, (dso__short_name(curr_dso) + dso__short_name_len= (dso))) =3D=3D 0) return 0; =20 if (strcmp(section_name, ".text") =3D=3D 0) { @@ -1387,7 +1387,7 @@ static int dso__process_kernel_symbol(struct dso *dso= , struct map *map, * kallsyms and identity maps. Overwrite it to * map to the kernel dso. */ - if (*remap_kernel && dso->kernel && !kmodule) { + if (*remap_kernel && dso__kernel(dso) && !kmodule) { *remap_kernel =3D false; map__set_start(map, shdr->sh_addr + ref_reloc(kmap)); map__set_end(map, map__start(map) + shdr->sh_size); @@ -1424,7 +1424,7 @@ static int dso__process_kernel_symbol(struct dso *dso= , struct map *map, if (!kmap) return 0; =20 - snprintf(dso_name, sizeof(dso_name), "%s%s", dso->short_name, section_nam= e); + snprintf(dso_name, sizeof(dso_name), "%s%s", dso__short_name(dso), sectio= n_name); =20 curr_map =3D maps__find_by_name(kmaps, dso_name); if (curr_map =3D=3D NULL) { @@ -1436,17 +1436,17 @@ static int dso__process_kernel_symbol(struct dso *d= so, struct map *map, curr_dso =3D dso__new(dso_name); if (curr_dso =3D=3D NULL) return -1; - curr_dso->kernel =3D dso->kernel; - curr_dso->long_name =3D dso->long_name; - curr_dso->long_name_len =3D dso->long_name_len; - curr_dso->binary_type =3D dso->binary_type; - curr_dso->adjust_symbols =3D dso->adjust_symbols; + dso__set_kernel(curr_dso, dso__kernel(dso)); + RC_CHK_ACCESS(curr_dso)->long_name =3D dso__long_name(dso); + RC_CHK_ACCESS(curr_dso)->long_name_len =3D dso__long_name_len(dso); + dso__set_binary_type(curr_dso, dso__binary_type(dso)); + dso__set_adjust_symbols(curr_dso, dso__adjust_symbols(dso)); curr_map =3D map__new2(start, curr_dso); dso__put(curr_dso); if (curr_map =3D=3D NULL) return -1; =20 - if (curr_dso->kernel) + if (dso__kernel(curr_dso)) map__kmap(curr_map)->kmaps =3D kmaps; =20 if (adjust_kernel_syms) { @@ -1456,7 +1456,7 @@ static int dso__process_kernel_symbol(struct dso *dso= , struct map *map, } else { map__set_mapping_type(curr_map, MAPPING_TYPE__IDENTITY); } - curr_dso->symtab_type =3D dso->symtab_type; + dso__set_symtab_type(curr_dso, dso__symtab_type(dso)); if (maps__insert(kmaps, curr_map)) return -1; /* @@ -1482,7 +1482,7 @@ static int dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *sy= ms_ss, struct symsrc *runtime_ss, int kmodule, int dynsym) { - struct kmap *kmap =3D dso->kernel ? map__kmap(map) : NULL; + struct kmap *kmap =3D dso__kernel(dso) ? map__kmap(map) : NULL; struct maps *kmaps =3D kmap ? map__kmaps(map) : NULL; struct map *curr_map =3D map; struct dso *curr_dso =3D dso; @@ -1515,8 +1515,8 @@ dso__load_sym_internal(struct dso *dso, struct map *m= ap, struct symsrc *syms_ss, =20 if (elf_section_by_name(runtime_ss->elf, &runtime_ss->ehdr, &tshdr, ".text", NULL)) { - dso->text_offset =3D tshdr.sh_addr - tshdr.sh_offset; - dso->text_end =3D tshdr.sh_offset + tshdr.sh_size; + dso__set_text_offset(dso, tshdr.sh_addr - tshdr.sh_offset); + dso__set_text_end(dso, tshdr.sh_offset + tshdr.sh_size); } =20 if (runtime_ss->opdsec) @@ -1575,16 +1575,16 @@ dso__load_sym_internal(struct dso *dso, struct map = *map, struct symsrc *syms_ss, * attempted to prelink vdso to its virtual address. */ if (dso__is_vdso(dso)) - map__set_reloc(map, map__start(map) - dso->text_offset); + map__set_reloc(map, map__start(map) - dso__text_offset(dso)); =20 - dso->adjust_symbols =3D runtime_ss->adjust_symbols || ref_reloc(kmap); + dso__set_adjust_symbols(dso, runtime_ss->adjust_symbols || ref_reloc(kmap= )); /* * Initial kernel and module mappings do not map to the dso. * Flag the fixups. */ - if (dso->kernel) { + if (dso__kernel(dso)) { remap_kernel =3D true; - adjust_kernel_syms =3D dso->adjust_symbols; + adjust_kernel_syms =3D dso__adjust_symbols(dso); } elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) { struct symbol *f; @@ -1673,7 +1673,7 @@ dso__load_sym_internal(struct dso *dso, struct map *m= ap, struct symsrc *syms_ss, (sym.st_value & 1)) --sym.st_value; =20 - if (dso->kernel) { + if (dso__kernel(dso)) { if (dso__process_kernel_symbol(dso, map, &sym, &shdr, kmaps, kmap, &cur= r_dso, &curr_map, section_name, adjust_kernel_syms, kmodule, &remap_kernel)) goto out_elf_end; @@ -1721,7 +1721,7 @@ dso__load_sym_internal(struct dso *dso, struct map *m= ap, struct symsrc *syms_ss, =20 arch__sym_update(f, &sym); =20 - __symbols__insert(&curr_dso->symbols, f, dso->kernel); + __symbols__insert(dso__symbols(curr_dso), f, dso__kernel(dso)); nr++; } =20 @@ -1729,8 +1729,8 @@ dso__load_sym_internal(struct dso *dso, struct map *m= ap, struct symsrc *syms_ss, * For misannotated, zeroed, ASM function sizes. */ if (nr > 0) { - symbols__fixup_end(&dso->symbols, false); - symbols__fixup_duplicate(&dso->symbols); + symbols__fixup_end(dso__symbols(dso), false); + symbols__fixup_duplicate(dso__symbols(dso)); if (kmap) { /* * We need to fixup this here too because we create new @@ -1750,16 +1750,16 @@ int dso__load_sym(struct dso *dso, struct map *map,= struct symsrc *syms_ss, int nr =3D 0; int err =3D -1; =20 - dso->symtab_type =3D syms_ss->type; - dso->is_64_bit =3D syms_ss->is_64_bit; - dso->rel =3D syms_ss->ehdr.e_type =3D=3D ET_REL; + dso__set_symtab_type(dso, syms_ss->type); + dso__set_is_64_bit(dso, syms_ss->is_64_bit); + dso__set_rel(dso, syms_ss->ehdr.e_type =3D=3D ET_REL); =20 /* * Modules may already have symbols from kallsyms, but those symbols * have the wrong values for the dso maps, so remove them. */ if (kmodule && syms_ss->symtab) - symbols__delete(&dso->symbols); + symbols__delete(dso__symbols(dso)); =20 if (!syms_ss->symtab) { /* @@ -1767,7 +1767,7 @@ int dso__load_sym(struct dso *dso, struct map *map, s= truct symsrc *syms_ss, * to using kallsyms. The vmlinux runtime symbols aren't * of much use. */ - if (dso->kernel) + if (dso__kernel(dso)) return err; } else { err =3D dso__load_sym_internal(dso, map, syms_ss, runtime_ss, diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 35975189999b..7a065a075a32 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -515,52 +515,52 @@ static struct symbol *symbols__find_by_name(struct sy= mbol *symbols[], =20 void dso__reset_find_symbol_cache(struct dso *dso) { - dso->last_find_result.addr =3D 0; - dso->last_find_result.symbol =3D NULL; + dso__set_last_find_result_addr(dso, 0); + dso__set_last_find_result_symbol(dso, NULL); } =20 void dso__insert_symbol(struct dso *dso, struct symbol *sym) { - __symbols__insert(&dso->symbols, sym, dso->kernel); + __symbols__insert(dso__symbols(dso), sym, dso__kernel(dso)); =20 /* update the symbol cache if necessary */ - if (dso->last_find_result.addr >=3D sym->start && - (dso->last_find_result.addr < sym->end || + if (dso__last_find_result_addr(dso) >=3D sym->start && + (dso__last_find_result_addr(dso) < sym->end || sym->start =3D=3D sym->end)) { - dso->last_find_result.symbol =3D sym; + dso__set_last_find_result_symbol(dso, sym); } } =20 void dso__delete_symbol(struct dso *dso, struct symbol *sym) { - rb_erase_cached(&sym->rb_node, &dso->symbols); + rb_erase_cached(&sym->rb_node, dso__symbols(dso)); symbol__delete(sym); dso__reset_find_symbol_cache(dso); } =20 struct symbol *dso__find_symbol(struct dso *dso, u64 addr) { - if (dso->last_find_result.addr !=3D addr || dso->last_find_result.symbol = =3D=3D NULL) { - dso->last_find_result.addr =3D addr; - dso->last_find_result.symbol =3D symbols__find(&dso->symbols, addr); + if (dso__last_find_result_addr(dso) !=3D addr || dso__last_find_result_sy= mbol(dso) =3D=3D NULL) { + dso__set_last_find_result_addr(dso, addr); + dso__set_last_find_result_symbol(dso, symbols__find(dso__symbols(dso), a= ddr)); } =20 - return dso->last_find_result.symbol; + return dso__last_find_result_symbol(dso); } =20 struct symbol *dso__find_symbol_nocache(struct dso *dso, u64 addr) { - return symbols__find(&dso->symbols, addr); + return symbols__find(dso__symbols(dso), addr); } =20 struct symbol *dso__first_symbol(struct dso *dso) { - return symbols__first(&dso->symbols); + return symbols__first(dso__symbols(dso)); } =20 struct symbol *dso__last_symbol(struct dso *dso) { - return symbols__last(&dso->symbols); + return symbols__last(dso__symbols(dso)); } =20 struct symbol *dso__next_symbol(struct symbol *sym) @@ -570,11 +570,11 @@ struct symbol *dso__next_symbol(struct symbol *sym) =20 struct symbol *dso__next_symbol_by_name(struct dso *dso, size_t *idx) { - if (*idx + 1 >=3D dso->symbol_names_len) + if (*idx + 1 >=3D dso__symbol_names_len(dso)) return NULL; =20 ++*idx; - return dso->symbol_names[*idx]; + return dso__symbol_names(dso)[*idx]; } =20 /* @@ -582,27 +582,29 @@ struct symbol *dso__next_symbol_by_name(struct dso *d= so, size_t *idx) */ struct symbol *dso__find_symbol_by_name(struct dso *dso, const char *name,= size_t *idx) { - struct symbol *s =3D symbols__find_by_name(dso->symbol_names, dso->symbol= _names_len, - name, SYMBOL_TAG_INCLUDE__NONE, idx); - if (!s) - s =3D symbols__find_by_name(dso->symbol_names, dso->symbol_names_len, - name, SYMBOL_TAG_INCLUDE__DEFAULT_ONLY, idx); + struct symbol *s =3D symbols__find_by_name(dso__symbol_names(dso), + dso__symbol_names_len(dso), + name, SYMBOL_TAG_INCLUDE__NONE, idx); + if (!s) { + s =3D symbols__find_by_name(dso__symbol_names(dso), dso__symbol_names_le= n(dso), + name, SYMBOL_TAG_INCLUDE__DEFAULT_ONLY, idx); + } return s; } =20 void dso__sort_by_name(struct dso *dso) { - mutex_lock(&dso->lock); + mutex_lock(dso__lock(dso)); if (!dso__sorted_by_name(dso)) { size_t len; =20 - dso->symbol_names =3D symbols__sort_by_name(&dso->symbols, &len); - if (dso->symbol_names) { - dso->symbol_names_len =3D len; + dso__set_symbol_names(dso, symbols__sort_by_name(dso__symbols(dso), &len= )); + if (dso__symbol_names(dso)) { + dso__set_symbol_names_len(dso, len); dso__set_sorted_by_name(dso); } } - mutex_unlock(&dso->lock); + mutex_unlock(dso__lock(dso)); } =20 /* @@ -729,7 +731,7 @@ static int map__process_kallsym_symbol(void *arg, const= char *name, { struct symbol *sym; struct dso *dso =3D arg; - struct rb_root_cached *root =3D &dso->symbols; + struct rb_root_cached *root =3D dso__symbols(dso); =20 if (!symbol_type__filter(type)) return 0; @@ -769,8 +771,8 @@ static int maps__split_kallsyms_for_kcore(struct maps *= kmaps, struct dso *dso) { struct symbol *pos; int count =3D 0; - struct rb_root_cached old_root =3D dso->symbols; - struct rb_root_cached *root =3D &dso->symbols; + struct rb_root_cached *root =3D dso__symbols(dso); + struct rb_root_cached old_root =3D *root; struct rb_node *next =3D rb_first_cached(root); =20 if (!kmaps) @@ -804,13 +806,13 @@ static int maps__split_kallsyms_for_kcore(struct maps= *kmaps, struct dso *dso) pos->end =3D map__end(curr_map); if (pos->end) pos->end -=3D map__start(curr_map) - map__pgoff(curr_map); - symbols__insert(&curr_map_dso->symbols, pos); + symbols__insert(dso__symbols(curr_map_dso), pos); ++count; map__put(curr_map); } =20 /* Symbols have been adjusted */ - dso->adjust_symbols =3D 1; + dso__set_adjust_symbols(dso, true); =20 return count; } @@ -827,7 +829,7 @@ static int maps__split_kallsyms(struct maps *kmaps, str= uct dso *dso, u64 delta, struct map *curr_map =3D map__get(initial_map); struct symbol *pos; int count =3D 0, moved =3D 0; - struct rb_root_cached *root =3D &dso->symbols; + struct rb_root_cached *root =3D dso__symbols(dso); struct rb_node *next =3D rb_first_cached(root); int kernel_range =3D 0; bool x86_64; @@ -854,9 +856,9 @@ static int maps__split_kallsyms(struct maps *kmaps, str= uct dso *dso, u64 delta, =20 *module++ =3D '\0'; curr_map_dso =3D map__dso(curr_map); - if (strcmp(curr_map_dso->short_name, module)) { + if (strcmp(dso__short_name(curr_map_dso), module)) { if (!RC_CHK_EQUAL(curr_map, initial_map) && - dso->kernel =3D=3D DSO_SPACE__KERNEL_GUEST && + dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL_GUEST && machine__is_default_guest(machine)) { /* * We assume all symbols of a module are @@ -879,7 +881,7 @@ static int maps__split_kallsyms(struct maps *kmaps, str= uct dso *dso, u64 delta, goto discard_symbol; } curr_map_dso =3D map__dso(curr_map); - if (curr_map_dso->loaded && + if (dso__loaded(curr_map_dso) && !machine__is_default_guest(machine)) goto discard_symbol; } @@ -915,7 +917,7 @@ static int maps__split_kallsyms(struct maps *kmaps, str= uct dso *dso, u64 delta, goto add_symbol; } =20 - if (dso->kernel =3D=3D DSO_SPACE__KERNEL_GUEST) + if (dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL_GUEST) snprintf(dso_name, sizeof(dso_name), "[guest.kernel].%d", kernel_range++); @@ -929,7 +931,7 @@ static int maps__split_kallsyms(struct maps *kmaps, str= uct dso *dso, u64 delta, if (ndso =3D=3D NULL) return -1; =20 - ndso->kernel =3D dso->kernel; + dso__set_kernel(ndso, dso__kernel(dso)); =20 curr_map =3D map__new2(pos->start, ndso); if (curr_map =3D=3D NULL) { @@ -954,7 +956,7 @@ static int maps__split_kallsyms(struct maps *kmaps, str= uct dso *dso, u64 delta, struct dso *curr_map_dso =3D map__dso(curr_map); =20 rb_erase_cached(&pos->rb_node, root); - symbols__insert(&curr_map_dso->symbols, pos); + symbols__insert(dso__symbols(curr_map_dso), pos); ++moved; } else ++count; @@ -966,7 +968,7 @@ static int maps__split_kallsyms(struct maps *kmaps, str= uct dso *dso, u64 delta, } =20 if (!RC_CHK_EQUAL(curr_map, initial_map) && - dso->kernel =3D=3D DSO_SPACE__KERNEL_GUEST && + dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL_GUEST && machine__is_default_guest(maps__machine(kmaps))) { dso__set_loaded(map__dso(curr_map)); } @@ -1140,7 +1142,7 @@ static int do_validate_kcore_modules_cb(struct map *o= ld_map, void *data) =20 dso =3D map__dso(old_map); /* Module must be in memory at the same address */ - mi =3D find_module(dso->short_name, modules); + mi =3D find_module(dso__short_name(dso), modules); if (!mi || mi->start !=3D map__start(old_map)) return -EINVAL; =20 @@ -1309,7 +1311,7 @@ static int dso__load_kcore(struct dso *dso, struct ma= p *map, &is_64_bit); if (err) goto out_err; - dso->is_64_bit =3D is_64_bit; + dso__set_is_64_bit(dso, is_64_bit); =20 if (list_empty(&md.maps)) { err =3D -EINVAL; @@ -1401,10 +1403,10 @@ static int dso__load_kcore(struct dso *dso, struct = map *map, * Set the data type and long name so that kcore can be read via * dso__data_read_addr(). */ - if (dso->kernel =3D=3D DSO_SPACE__KERNEL_GUEST) - dso->binary_type =3D DSO_BINARY_TYPE__GUEST_KCORE; + if (dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL_GUEST) + dso__set_binary_type(dso, DSO_BINARY_TYPE__GUEST_KCORE); else - dso->binary_type =3D DSO_BINARY_TYPE__KCORE; + dso__set_binary_type(dso, DSO_BINARY_TYPE__KCORE); dso__set_long_name(dso, strdup(kcore_filename), true); =20 close(fd); @@ -1465,13 +1467,13 @@ int __dso__load_kallsyms(struct dso *dso, const cha= r *filename, if (kallsyms__delta(kmap, filename, &delta)) return -1; =20 - symbols__fixup_end(&dso->symbols, true); - symbols__fixup_duplicate(&dso->symbols); + symbols__fixup_end(dso__symbols(dso), true); + symbols__fixup_duplicate(dso__symbols(dso)); =20 - if (dso->kernel =3D=3D DSO_SPACE__KERNEL_GUEST) - dso->symtab_type =3D DSO_BINARY_TYPE__GUEST_KALLSYMS; + if (dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL_GUEST) + dso__set_symtab_type(dso, DSO_BINARY_TYPE__GUEST_KALLSYMS); else - dso->symtab_type =3D DSO_BINARY_TYPE__KALLSYMS; + dso__set_symtab_type(dso, DSO_BINARY_TYPE__KALLSYMS); =20 if (!no_kcore && !dso__load_kcore(dso, map, filename)) return maps__split_kallsyms_for_kcore(kmap->kmaps, dso); @@ -1527,7 +1529,7 @@ static int dso__load_perf_map(const char *map_path, s= truct dso *dso) if (sym =3D=3D NULL) goto out_delete_line; =20 - symbols__insert(&dso->symbols, sym); + symbols__insert(dso__symbols(dso), sym); nr_syms++; } =20 @@ -1653,15 +1655,15 @@ int dso__load_bfd_symbols(struct dso *dso, const ch= ar *debugfile) if (!symbol) goto out_free; =20 - symbols__insert(&dso->symbols, symbol); + symbols__insert(dso__symbols(dso), symbol); } #ifdef bfd_get_section #undef bfd_asymbol_section #endif =20 - symbols__fixup_end(&dso->symbols, false); - symbols__fixup_duplicate(&dso->symbols); - dso->adjust_symbols =3D 1; + symbols__fixup_end(dso__symbols(dso), false); + symbols__fixup_duplicate(dso__symbols(dso)); + dso__set_adjust_symbols(dso); =20 err =3D 0; out_free: @@ -1684,17 +1686,17 @@ static bool dso__is_compatible_symtab_type(struct d= so *dso, bool kmod, case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: - return !kmod && dso->kernel =3D=3D DSO_SPACE__USER; + return !kmod && dso__kernel(dso) =3D=3D DSO_SPACE__USER; =20 case DSO_BINARY_TYPE__KALLSYMS: case DSO_BINARY_TYPE__VMLINUX: case DSO_BINARY_TYPE__KCORE: - return dso->kernel =3D=3D DSO_SPACE__KERNEL; + return dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL; =20 case DSO_BINARY_TYPE__GUEST_KALLSYMS: case DSO_BINARY_TYPE__GUEST_VMLINUX: case DSO_BINARY_TYPE__GUEST_KCORE: - return dso->kernel =3D=3D DSO_SPACE__KERNEL_GUEST; + return dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL_GUEST; =20 case DSO_BINARY_TYPE__GUEST_KMODULE: case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: @@ -1704,7 +1706,7 @@ static bool dso__is_compatible_symtab_type(struct dso= *dso, bool kmod, * kernel modules know their symtab type - it's set when * creating a module dso in machine__addnew_module_map(). */ - return kmod && dso->symtab_type =3D=3D type; + return kmod && dso__symtab_type(dso) =3D=3D type; =20 case DSO_BINARY_TYPE__BUILD_ID_CACHE: case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: @@ -1772,18 +1774,19 @@ int dso__load(struct dso *dso, struct map *map) struct build_id bid; struct nscookie nsc; char newmapname[PATH_MAX]; - const char *map_path =3D dso->long_name; + const char *map_path =3D dso__long_name(dso); =20 - mutex_lock(&dso->lock); - perfmap =3D strncmp(dso->name, "/tmp/perf-", 10) =3D=3D 0; + mutex_lock(dso__lock(dso)); + perfmap =3D strncmp(dso__name(dso), "/tmp/perf-", 10) =3D=3D 0; if (perfmap) { - if (dso->nsinfo && (dso__find_perf_map(newmapname, - sizeof(newmapname), &dso->nsinfo) =3D=3D 0)) { + if (dso__nsinfo(dso) && + (dso__find_perf_map(newmapname, sizeof(newmapname), + dso__nsinfo_ptr(dso)) =3D=3D 0)) { map_path =3D newmapname; } } =20 - nsinfo__mountns_enter(dso->nsinfo, &nsc); + nsinfo__mountns_enter(dso__nsinfo(dso), &nsc); =20 /* check again under the dso->lock */ if (dso__loaded(dso)) { @@ -1791,15 +1794,15 @@ int dso__load(struct dso *dso, struct map *map) goto out; } =20 - kmod =3D dso->symtab_type =3D=3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE || - dso->symtab_type =3D=3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP || - dso->symtab_type =3D=3D DSO_BINARY_TYPE__GUEST_KMODULE || - dso->symtab_type =3D=3D DSO_BINARY_TYPE__GUEST_KMODULE_COMP; + kmod =3D dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODUL= E || + dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP || + dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__GUEST_KMODULE || + dso__symtab_type(dso) =3D=3D DSO_BINARY_TYPE__GUEST_KMODULE_COMP; =20 - if (dso->kernel && !kmod) { - if (dso->kernel =3D=3D DSO_SPACE__KERNEL) + if (dso__kernel(dso) && !kmod) { + if (dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL) ret =3D dso__load_kernel_sym(dso, map); - else if (dso->kernel =3D=3D DSO_SPACE__KERNEL_GUEST) + else if (dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL_GUEST) ret =3D dso__load_guest_kernel_sym(dso, map); =20 machine =3D maps__machine(map__kmaps(map)); @@ -1808,12 +1811,13 @@ int dso__load(struct dso *dso, struct map *map) goto out; } =20 - dso->adjust_symbols =3D 0; + dso__set_adjust_symbols(dso, false); =20 if (perfmap) { ret =3D dso__load_perf_map(map_path, dso); - dso->symtab_type =3D ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT : - DSO_BINARY_TYPE__NOT_FOUND; + dso__set_symtab_type(dso, ret > 0 + ? DSO_BINARY_TYPE__JAVA_JIT + : DSO_BINARY_TYPE__NOT_FOUND); goto out; } =20 @@ -1828,9 +1832,9 @@ int dso__load(struct dso *dso, struct map *map) * Read the build id if possible. This is required for * DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work */ - if (!dso->has_build_id && - is_regular_file(dso->long_name)) { - __symbol__join_symfs(name, PATH_MAX, dso->long_name); + if (!dso__has_build_id(dso) && + is_regular_file(dso__long_name(dso))) { + __symbol__join_symfs(name, PATH_MAX, dso__long_name(dso)); if (filename__read_build_id(name, &bid) > 0) dso__set_build_id(dso, &bid); } @@ -1864,7 +1868,7 @@ int dso__load(struct dso *dso, struct map *map) nsinfo__mountns_exit(&nsc); =20 is_reg =3D is_regular_file(name); - if (!is_reg && errno =3D=3D ENOENT && dso->nsinfo) { + if (!is_reg && errno =3D=3D ENOENT && dso__nsinfo(dso)) { char *new_name =3D dso__filename_with_chroot(dso, name); if (new_name) { is_reg =3D is_regular_file(new_name); @@ -1881,7 +1885,7 @@ int dso__load(struct dso *dso, struct map *map) sirc =3D symsrc__init(ss, dso, name, symtab_type); =20 if (nsexit) - nsinfo__mountns_enter(dso->nsinfo, &nsc); + nsinfo__mountns_enter(dso__nsinfo(dso), &nsc); =20 if (bfdrc =3D=3D 0) { ret =3D 0; @@ -1894,8 +1898,8 @@ int dso__load(struct dso *dso, struct map *map) if (!syms_ss && symsrc__has_symtab(ss)) { syms_ss =3D ss; next_slot =3D true; - if (!dso->symsrc_filename) - dso->symsrc_filename =3D strdup(name); + if (!dso__symsrc_filename(dso)) + dso__set_symsrc_filename(dso, strdup(name)); } =20 if (!runtime_ss && symsrc__possibly_runtime(ss)) { @@ -1942,11 +1946,11 @@ int dso__load(struct dso *dso, struct map *map) symsrc__destroy(&ss_[ss_pos - 1]); out_free: free(name); - if (ret < 0 && strstr(dso->name, " (deleted)") !=3D NULL) + if (ret < 0 && strstr(dso__name(dso), " (deleted)") !=3D NULL) ret =3D 0; out: dso__set_loaded(dso); - mutex_unlock(&dso->lock); + mutex_unlock(dso__lock(dso)); nsinfo__mountns_exit(&nsc); =20 return ret; @@ -1965,7 +1969,7 @@ int dso__load_vmlinux(struct dso *dso, struct map *ma= p, else symbol__join_symfs(symfs_vmlinux, vmlinux); =20 - if (dso->kernel =3D=3D DSO_SPACE__KERNEL_GUEST) + if (dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL_GUEST) symtab_type =3D DSO_BINARY_TYPE__GUEST_VMLINUX; else symtab_type =3D DSO_BINARY_TYPE__VMLINUX; @@ -1978,10 +1982,10 @@ int dso__load_vmlinux(struct dso *dso, struct map *= map, * an incorrect long name unless we set it here first. */ dso__set_long_name(dso, vmlinux, vmlinux_allocated); - if (dso->kernel =3D=3D DSO_SPACE__KERNEL_GUEST) - dso->binary_type =3D DSO_BINARY_TYPE__GUEST_VMLINUX; + if (dso__kernel(dso) =3D=3D DSO_SPACE__KERNEL_GUEST) + dso__set_binary_type(dso, DSO_BINARY_TYPE__GUEST_VMLINUX); else - dso->binary_type =3D DSO_BINARY_TYPE__VMLINUX; + dso__set_binary_type(dso, DSO_BINARY_TYPE__VMLINUX); =20 err =3D dso__load_sym(dso, map, &ss, &ss, 0); symsrc__destroy(&ss); @@ -2074,7 +2078,7 @@ static char *dso__find_kallsyms(struct dso *dso, stru= ct map *map) bool is_host =3D false; char path[PATH_MAX]; =20 - if (!dso->has_build_id) { + if (!dso__has_build_id(dso)) { /* * Last resort, if we don't have a build-id and couldn't find * any vmlinux file, try the running kernel kallsyms table. @@ -2099,7 +2103,7 @@ static char *dso__find_kallsyms(struct dso *dso, stru= ct map *map) goto proc_kallsyms; } =20 - build_id__sprintf(&dso->bid, sbuild_id); + build_id__sprintf(dso__bid(dso), sbuild_id); =20 /* Find kallsyms in build-id cache with kcore */ scnprintf(path, sizeof(path), "%s/%s/%s", @@ -2192,7 +2196,7 @@ static int dso__load_kernel_sym(struct dso *dso, stru= ct map *map) free(kallsyms_allocated_filename); =20 if (err > 0 && !dso__is_kcore(dso)) { - dso->binary_type =3D DSO_BINARY_TYPE__KALLSYMS; + dso__set_binary_type(dso, DSO_BINARY_TYPE__KALLSYMS); dso__set_long_name(dso, DSO__NAME_KALLSYMS, false); map__fixup_start(map); map__fixup_end(map); @@ -2235,7 +2239,7 @@ static int dso__load_guest_kernel_sym(struct dso *dso= , struct map *map) if (err > 0) pr_debug("Using %s for symbols\n", kallsyms_filename); if (err > 0 && !dso__is_kcore(dso)) { - dso->binary_type =3D DSO_BINARY_TYPE__GUEST_KALLSYMS; + dso__set_binary_type(dso, DSO_BINARY_TYPE__GUEST_KALLSYMS); dso__set_long_name(dso, machine->mmap_name, false); map__fixup_start(map); map__fixup_end(map); diff --git a/tools/perf/util/symbol_fprintf.c b/tools/perf/util/symbol_fpri= ntf.c index 088f4abf230f..53e1af4ed9ac 100644 --- a/tools/perf/util/symbol_fprintf.c +++ b/tools/perf/util/symbol_fprintf.c @@ -64,8 +64,8 @@ size_t dso__fprintf_symbols_by_name(struct dso *dso, { size_t ret =3D 0; =20 - for (size_t i =3D 0; i < dso->symbol_names_len; i++) { - struct symbol *pos =3D dso->symbol_names[i]; + for (size_t i =3D 0; i < dso__symbol_names_len(dso); i++) { + struct symbol *pos =3D dso__symbol_names(dso)[i]; =20 ret +=3D fprintf(fp, "%s\n", pos->name); } diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index cdab6aa04917..5190566676a7 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -386,8 +386,8 @@ static void perf_record_mmap2__read_build_id(struct per= f_record_mmap2 *event, id.ino_generation =3D event->ino_generation; =20 dso =3D dsos__findnew_id(&machine->dsos, event->filename, &id); - if (dso && dso->has_build_id) { - bid =3D dso->bid; + if (dso && dso__has_build_id(dso)) { + bid =3D *dso__bid(dso); rc =3D 0; goto out; } @@ -408,7 +408,7 @@ static void perf_record_mmap2__read_build_id(struct per= f_record_mmap2 *event, event->__reserved_1 =3D 0; event->__reserved_2 =3D 0; =20 - if (dso && !dso->has_build_id) + if (dso && !dso__has_build_id(dso)) dso__set_build_id(dso, &bid); } else { if (event->filename[0] =3D=3D '/') { @@ -685,7 +685,7 @@ static int perf_event__synthesize_modules_maps_cb(struc= t map *map, void *data) =20 dso =3D map__dso(map); if (symbol_conf.buildid_mmap2) { - size =3D PERF_ALIGN(dso->long_name_len + 1, sizeof(u64)); + size =3D PERF_ALIGN(dso__long_name_len(dso) + 1, sizeof(u64)); event->mmap2.header.type =3D PERF_RECORD_MMAP2; event->mmap2.header.size =3D (sizeof(event->mmap2) - (sizeof(event->mmap2.filename) - size)); @@ -695,11 +695,11 @@ static int perf_event__synthesize_modules_maps_cb(str= uct map *map, void *data) event->mmap2.len =3D map__size(map); event->mmap2.pid =3D args->machine->pid; =20 - memcpy(event->mmap2.filename, dso->long_name, dso->long_name_len + 1); + memcpy(event->mmap2.filename, dso__long_name(dso), dso__long_name_len(ds= o) + 1); =20 perf_record_mmap2__read_build_id(&event->mmap2, args->machine, false); } else { - size =3D PERF_ALIGN(dso->long_name_len + 1, sizeof(u64)); + size =3D PERF_ALIGN(dso__long_name_len(dso) + 1, sizeof(u64)); event->mmap.header.type =3D PERF_RECORD_MMAP; event->mmap.header.size =3D (sizeof(event->mmap) - (sizeof(event->mmap.filename) - size)); @@ -709,7 +709,7 @@ static int perf_event__synthesize_modules_maps_cb(struc= t map *map, void *data) event->mmap.len =3D map__size(map); event->mmap.pid =3D args->machine->pid; =20 - memcpy(event->mmap.filename, dso->long_name, dso->long_name_len + 1); + memcpy(event->mmap.filename, dso__long_name(dso), dso__long_name_len(dso= ) + 1); } =20 if (perf_tool__process_synth_event(args->tool, event, args->machine, args= ->process) !=3D 0) @@ -2233,20 +2233,20 @@ int perf_event__synthesize_build_id(struct perf_too= l *tool, struct dso *pos, u16 union perf_event ev; size_t len; =20 - if (!pos->hit) + if (!dso__hit(pos)) return 0; =20 memset(&ev, 0, sizeof(ev)); =20 - len =3D pos->long_name_len + 1; + len =3D dso__long_name_len(pos) + 1; len =3D PERF_ALIGN(len, NAME_ALIGN); - ev.build_id.size =3D min(pos->bid.size, sizeof(pos->bid.data)); - memcpy(&ev.build_id.build_id, pos->bid.data, ev.build_id.size); + ev.build_id.size =3D min(dso__bid(pos)->size, sizeof(dso__bid(pos)->data)= ); + memcpy(&ev.build_id.build_id, dso__bid(pos)->data, ev.build_id.size); ev.build_id.header.type =3D PERF_RECORD_HEADER_BUILD_ID; ev.build_id.header.misc =3D misc | PERF_RECORD_MISC_BUILD_ID_SIZE; ev.build_id.pid =3D machine->pid; ev.build_id.header.size =3D sizeof(ev.build_id) + len; - memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len); + memcpy(&ev.build_id.filename, dso__long_name(pos), dso__long_name_len(pos= )); =20 return process(tool, &ev, NULL, machine); } diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 1aa8962dcf52..0a473112f881 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c @@ -457,14 +457,14 @@ int thread__memcpy(struct thread *thread, struct mach= ine *machine, =20 dso =3D map__dso(al.map); =20 - if (!dso || dso->data.status =3D=3D DSO_DATA_STATUS_ERROR || map__load(al= .map) < 0) { + if (!dso || dso__data(dso)->status =3D=3D DSO_DATA_STATUS_ERROR || map__l= oad(al.map) < 0) { addr_location__exit(&al); return -1; } =20 offset =3D map__map_ip(al.map, ip); if (is64bit) - *is64bit =3D dso->is_64_bit; + *is64bit =3D dso__is_64_bit(dso); =20 addr_location__exit(&al); =20 diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unw= ind-libunwind-local.c index b69dc3a447db..2e7fc5c987f8 100644 --- a/tools/perf/util/unwind-libunwind-local.c +++ b/tools/perf/util/unwind-libunwind-local.c @@ -329,27 +329,27 @@ static int read_unwind_spec_eh_frame(struct dso *dso,= struct unwind_info *ui, }; int ret, fd; =20 - if (dso->data.eh_frame_hdr_offset =3D=3D 0) { + if (dso__data(dso)->eh_frame_hdr_offset =3D=3D 0) { fd =3D dso__data_get_fd(dso, ui->machine); if (fd < 0) return -EINVAL; =20 /* Check the .eh_frame section for unwinding info */ ret =3D elf_section_address_and_offset(fd, ".eh_frame_hdr", - &dso->data.eh_frame_hdr_addr, - &dso->data.eh_frame_hdr_offset); - dso->data.elf_base_addr =3D elf_base_address(fd); + &dso__data(dso)->eh_frame_hdr_addr, + &dso__data(dso)->eh_frame_hdr_offset); + dso__data(dso)->elf_base_addr =3D elf_base_address(fd); dso__data_put_fd(dso); - if (ret || dso->data.eh_frame_hdr_offset =3D=3D 0) + if (ret || dso__data(dso)->eh_frame_hdr_offset =3D=3D 0) return -EINVAL; } =20 maps__for_each_map(thread__maps(ui->thread), read_unwind_spec_eh_frame_ma= ps_cb, &args); =20 - args.base_addr -=3D dso->data.elf_base_addr; + args.base_addr -=3D dso__data(dso)->elf_base_addr; /* Address of .eh_frame_hdr */ - *segbase =3D args.base_addr + dso->data.eh_frame_hdr_addr; - ret =3D unwind_spec_ehframe(dso, ui->machine, dso->data.eh_frame_hdr_offs= et, + *segbase =3D args.base_addr + dso__data(dso)->eh_frame_hdr_addr; + ret =3D unwind_spec_ehframe(dso, ui->machine, dso__data(dso)->eh_frame_hd= r_offset, table_data, fde_count); if (ret) return ret; @@ -460,7 +460,7 @@ find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_= proc_info_t *pi, return -EINVAL; } =20 - pr_debug("unwind: find_proc_info dso %s\n", dso->name); + pr_debug("unwind: find_proc_info dso %s\n", dso__name(dso)); =20 /* Check the .eh_frame section for unwinding info */ if (!read_unwind_spec_eh_frame(dso, ui, &table_data, &segbase, &fde_count= )) { diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-li= bunwind.c index 2728eb4f13ea..cb8be6acfb6f 100644 --- a/tools/perf/util/unwind-libunwind.c +++ b/tools/perf/util/unwind-libunwind.c @@ -25,7 +25,7 @@ int unwind__prepare_access(struct maps *maps, struct map = *map, bool *initialized return 0; =20 if (maps__addr_space(maps)) { - pr_debug("unwind: thread map already set, dso=3D%s\n", dso->name); + pr_debug("unwind: thread map already set, dso=3D%s\n", dso__name(dso)); if (initialized) *initialized =3D true; return 0; diff --git a/tools/perf/util/vdso.c b/tools/perf/util/vdso.c index 35532dcbff74..1b6f8f6db7aa 100644 --- a/tools/perf/util/vdso.c +++ b/tools/perf/util/vdso.c @@ -148,7 +148,7 @@ static int machine__thread_dso_type_maps_cb(struct map = *map, void *data) struct machine__thread_dso_type_maps_cb_args *args =3D data; struct dso *dso =3D map__dso(map); =20 - if (!dso || dso->long_name[0] !=3D '/') + if (!dso || dso__long_name(dso)[0] !=3D '/') return 0; =20 args->dso_type =3D dso__type(dso, args->machine); @@ -361,7 +361,7 @@ struct dso *machine__findnew_vdso(struct machine *machi= ne, =20 bool dso__is_vdso(struct dso *dso) { - return !strcmp(dso->short_name, DSO__NAME_VDSO) || - !strcmp(dso->short_name, DSO__NAME_VDSO32) || - !strcmp(dso->short_name, DSO__NAME_VDSOX32); + return !strcmp(dso__short_name(dso), DSO__NAME_VDSO) || + !strcmp(dso__short_name(dso), DSO__NAME_VDSO32) || + !strcmp(dso__short_name(dso), DSO__NAME_VDSOX32); } --=20 2.43.0.rc1.413.gea7ed67945-goog