From: Masami Hiramatsu <masami.hiramatsu...@hitachi.com> Skip SDTs placed in invalid (non-exist, or older version) binaries. Note that perf-probe --cache --list and perf-probe --cache --del still handle all the caches including invalid binaries.
Signed-off-by: Masami Hiramatsu <masami.hiramatsu...@hitachi.com> Signed-off-by: Masami Hiramatsu <mhira...@kernel.org> --- Changes in v7: - Validate build-id via sysfs if it is for kallsyms, Changes in v4: - Rename a parameter 'valid' to 'validonly' :) --- tools/perf/builtin-probe.c | 2 +- tools/perf/util/build-id.c | 33 ++++++++++++++++++++++++++++++++- tools/perf/util/build-id.h | 2 +- tools/perf/util/parse-events.c | 2 +- tools/perf/util/probe-file.c | 2 +- 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index 8f61525..4a86aea 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c @@ -370,7 +370,7 @@ static int del_perf_probe_caches(struct strfilter *filter) struct str_node *nd; int ret; - ret = build_id_cache__list_all(&bidlist); + ret = build_id_cache__list_all(&bidlist, false); if (ret < 0) { pr_debug("Failed to get buildids: %d\n", ret); return ret; diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index 6063bee..ce02668 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -209,6 +209,31 @@ out: return ret; } +/* Check if the given build_id cache is valid on current running system */ +static bool build_id_cache__valid_id(char *sbuild_id) +{ + char real_sbuild_id[SBUILD_ID_SIZE] = ""; + char *pathname; + int ret = 0; + bool result = false; + + pathname = build_id_cache__origname(sbuild_id); + if (!pathname) + return false; + + if (!strcmp(pathname, DSO__NAME_KALLSYMS)) + ret = sysfs__sprintf_build_id("/", real_sbuild_id); + else if (pathname[0] == '/') + ret = filename__sprintf_build_id(pathname, real_sbuild_id); + else + ret = -EINVAL; /* Should we support other special DSO cache? */ + if (ret >= 0) + result = (strcmp(sbuild_id, real_sbuild_id) == 0); + free(pathname); + + return result; +} + static const char *build_id_cache__basename(bool is_kallsyms, bool is_vdso) { return is_kallsyms ? "kallsyms" : (is_vdso ? "vdso" : "elf"); @@ -420,7 +445,7 @@ void disable_buildid_cache(void) no_buildid_cache = true; } -int build_id_cache__list_all(struct strlist **result) +int build_id_cache__list_all(struct strlist **result, bool validonly) { struct strlist *toplist, *list, *bidlist; struct str_node *nd, *nd2; @@ -428,6 +453,10 @@ int build_id_cache__list_all(struct strlist **result) char sbuild_id[SBUILD_ID_SIZE]; int ret = 0; + /* for filename__ functions */ + if (validonly) + symbol__init(NULL); + /* Open the top-level directory */ if (asprintf(&topdir, "%s/.build-id/", buildid_dir) < 0) return -errno; @@ -457,6 +486,8 @@ int build_id_cache__list_all(struct strlist **result) nd->s, nd2->s); continue; } + if (validonly && !build_id_cache__valid_id(sbuild_id)) + continue; strlist__add(bidlist, sbuild_id); } strlist__delete(list); diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h index c05503e..480600b 100644 --- a/tools/perf/util/build-id.h +++ b/tools/perf/util/build-id.h @@ -34,7 +34,7 @@ char *build_id_cache__origname(const char *sbuild_id); char *build_id_cache__linkname(const char *sbuild_id, char *bf, size_t size); char *build_id_cache__cachedir(const char *sbuild_id, const char *name, bool is_kallsyms, bool is_vdso); -int build_id_cache__list_all(struct strlist **result); +int build_id_cache__list_all(struct strlist **result, bool validonly); int build_id_cache__list_build_ids(const char *pathname, struct strlist **result); bool build_id_cache__cached(const char *sbuild_id); diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index f9c8b7b..53d52a3 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1994,7 +1994,7 @@ void print_sdt_events(const char *subsys_glob, const char *event_glob, pr_debug("Failed to allocate new strlist for SDT\n"); return; } - ret = build_id_cache__list_all(&bidlist); + ret = build_id_cache__list_all(&bidlist, true); if (ret < 0) { pr_debug("Failed to get buildids: %d\n", ret); return; diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c index bc82a55..c4104c4 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -779,7 +779,7 @@ int probe_cache__show_all_caches(struct strfilter *filter) pr_debug("list cache with filter: %s\n", buf); free(buf); - ret = build_id_cache__list_all(&bidlist); + ret = build_id_cache__list_all(&bidlist, false); if (ret < 0) { pr_debug("Failed to get buildids: %d\n", ret); return ret == -ENOENT ? 0 : ret;