tools/perf/builtin-buildid-cache.c | 32 +++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-)
Identify vdso by file name matching. The vdso objects have name
as vdso[32,64].so[.dbg].
$ perf buildid-cache -a /work/linux/arch/x86/entry/vdso/vdso64.so.dbg
Without this change, added vdso using above command actually will never
be used.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Changbin Du <changbin.du@huawei.com>
---
This patch is separated from the series "perf: Support searching local
debugging vdso or specify vdso path in cmdline".
---
tools/perf/builtin-buildid-cache.c | 32 +++++++++++++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildid-cache.c
index b0511d16aeb6..08de05e2aaae 100644
--- a/tools/perf/builtin-buildid-cache.c
+++ b/tools/perf/builtin-buildid-cache.c
@@ -172,6 +172,36 @@ static int build_id_cache__add_kcore(const char *filename, bool force)
return 0;
}
+static bool filename_is_vdso(const char *filename)
+{
+ bool is_vdso = false;
+ char *fname, *bname;
+ static const char * const vdso_names[] = {
+ "vdso.so", "vdso32.so", "vdso64.so", "vdsox32.so"
+ };
+
+ fname = strdup(filename);
+ if (!fname) {
+ pr_err("no memory\n");
+ return false;
+ }
+
+ bname = basename(fname);
+ if (!bname)
+ goto out;
+
+ for (unsigned int i = 0; i < ARRAY_SIZE(vdso_names); i++) {
+ if (strstarts(bname, vdso_names[i])) {
+ is_vdso = true;
+ break;
+ }
+ }
+
+out:
+ free(fname);
+ return is_vdso;
+}
+
static int build_id_cache__add_file(const char *filename, struct nsinfo *nsi)
{
char sbuild_id[SBUILD_ID_SIZE];
@@ -189,7 +219,7 @@ static int build_id_cache__add_file(const char *filename, struct nsinfo *nsi)
build_id__sprintf(&bid, sbuild_id);
err = build_id_cache__add_s(sbuild_id, filename, nsi,
- false, false);
+ false, filename_is_vdso(filename));
pr_debug("Adding %s %s: %s\n", sbuild_id, filename,
err ? "FAIL" : "Ok");
return err;
--
2.34.1
On 12/09/24 14:16, Changbin Du wrote: > Identify vdso by file name matching. The vdso objects have name > as vdso[32,64].so[.dbg]. > > $ perf buildid-cache -a /work/linux/arch/x86/entry/vdso/vdso64.so.dbg > > Without this change, added vdso using above command actually will never > be used. > > Cc: Adrian Hunter <adrian.hunter@intel.com> > Signed-off-by: Changbin Du <changbin.du@huawei.com> I realized my example was overly convoluted since to overwrite the existing buildid cache entry the --update option could simply be used. However, that needs another change: diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildid-cache.c index 08de05e2aaae3..69f43460d007f 100644 --- a/tools/perf/builtin-buildid-cache.c +++ b/tools/perf/builtin-buildid-cache.c @@ -353,7 +353,7 @@ static int build_id_cache__update_file(const char *filename, struct nsinfo *nsi) if (!err) err = build_id_cache__add_s(sbuild_id, filename, nsi, false, - false); + filename_is_vdso(filename)); pr_debug("Updating %s %s: %s\n", sbuild_id, filename, err ? "FAIL" : "Ok"); With that you can add: Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> Tested-by: Adrian Hunter <adrian.hunter@intel.com> > > --- > This patch is separated from the series "perf: Support searching local > debugging vdso or specify vdso path in cmdline". > --- > tools/perf/builtin-buildid-cache.c | 32 +++++++++++++++++++++++++++++- > 1 file changed, 31 insertions(+), 1 deletion(-) > > diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildid-cache.c > index b0511d16aeb6..08de05e2aaae 100644 > --- a/tools/perf/builtin-buildid-cache.c > +++ b/tools/perf/builtin-buildid-cache.c > @@ -172,6 +172,36 @@ static int build_id_cache__add_kcore(const char *filename, bool force) > return 0; > } > > +static bool filename_is_vdso(const char *filename) > +{ > + bool is_vdso = false; > + char *fname, *bname; > + static const char * const vdso_names[] = { > + "vdso.so", "vdso32.so", "vdso64.so", "vdsox32.so" > + }; > + > + fname = strdup(filename); > + if (!fname) { > + pr_err("no memory\n"); > + return false; > + } > + > + bname = basename(fname); > + if (!bname) > + goto out; > + > + for (unsigned int i = 0; i < ARRAY_SIZE(vdso_names); i++) { > + if (strstarts(bname, vdso_names[i])) { > + is_vdso = true; > + break; > + } > + } > + > +out: > + free(fname); > + return is_vdso; > +} > + > static int build_id_cache__add_file(const char *filename, struct nsinfo *nsi) > { > char sbuild_id[SBUILD_ID_SIZE]; > @@ -189,7 +219,7 @@ static int build_id_cache__add_file(const char *filename, struct nsinfo *nsi) > > build_id__sprintf(&bid, sbuild_id); > err = build_id_cache__add_s(sbuild_id, filename, nsi, > - false, false); > + false, filename_is_vdso(filename)); > pr_debug("Adding %s %s: %s\n", sbuild_id, filename, > err ? "FAIL" : "Ok"); > return err;
© 2016 - 2024 Red Hat, Inc.