Skip SDTs placed in invalid (non-exist, or older version) binaries. Note that perf-probe --cache --list still shows all the caches including invalid binaries.
Signed-off-by: Masami Hiramatsu <[email protected]> --- tools/perf/util/build-id.c | 27 ++++++++++++++++++++++++++- tools/perf/util/build-id.h | 2 +- tools/perf/util/parse-events.c | 2 +- tools/perf/util/probe-event.c | 2 +- tools/perf/util/probe-file.c | 2 +- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index 31eb8d9..7635e66 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -178,6 +178,25 @@ out: return ret; } +static bool build_id_cache__valid_id(char *sbuild_id) +{ + char real_sbuild_id[SBUILD_ID_SIZE] = ""; + char *pathname; + bool ret; + + pathname = build_id_cache__origname(sbuild_id); + if (!pathname) + return false; + + if (filename__sprintf_build_id(pathname, real_sbuild_id) < 0) + ret = false; + else + ret = (strcmp(sbuild_id, real_sbuild_id) == 0); + free(pathname); + + return ret; +} + static const char *build_id_cache__basename(bool is_kallsyms, bool is_vdso) { return is_kallsyms ? "kallsyms" : (is_vdso ? "vdso" : "elf"); @@ -336,7 +355,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 valid) { struct strlist *toplist, *list, *bidlist; struct str_node *nd, *nd2; @@ -344,6 +363,10 @@ int build_id_cache__list_all(struct strlist **result) char sbuild_id[SBUILD_ID_SIZE]; int ret = 0; + /* for filename__ functions */ + if (valid) + symbol__init(NULL); + /* Open the top-level directory */ if (asprintf(&topdir, "%s/.build-id/", buildid_dir) < 0) return -errno; @@ -373,6 +396,8 @@ int build_id_cache__list_all(struct strlist **result) nd->s, nd2->s); continue; } + if (valid && !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 2d5c61c..1bf90ab 100644 --- a/tools/perf/util/build-id.h +++ b/tools/perf/util/build-id.h @@ -31,7 +31,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__dirname_from_path(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 valid); 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 485dbdc..a19f7f9 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1537,7 +1537,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-event.c b/tools/perf/util/probe-event.c index 92e800e..d2fa266 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -2792,7 +2792,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/probe-file.c b/tools/perf/util/probe-file.c index 018c443..70a6a5c 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -745,7 +745,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; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

