Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753656AbbHOLt3 (ORCPT ); Sat, 15 Aug 2015 07:49:29 -0400 Received: from mail7.hitachi.co.jp ([133.145.228.42]:45279 "EHLO mail7.hitachi.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752087AbbHOLsN (ORCPT ); Sat, 15 Aug 2015 07:48:13 -0400 X-AuditID: 85900ec0-9e1cab9000001a57-39-55cf26a7f47a Subject: [RFC PATCH perf/core v3 16/17] perf-list: Skip SDTs placed in invalid binaries From: Masami Hiramatsu To: Arnaldo Carvalho de Melo Cc: Peter Zijlstra , linux-kernel@vger.kernel.org, Adrian Hunter , Ingo Molnar , Paul Mackerras , Jiri Olsa , Namhyung Kim , Borislav Petkov , Hemant Kumar Date: Sat, 15 Aug 2015 20:43:27 +0900 Message-ID: <20150815114327.13642.466.stgit@localhost.localdomain> In-Reply-To: <20150815114252.13642.62690.stgit@localhost.localdomain> References: <20150815114252.13642.62690.stgit@localhost.localdomain> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Brightmail-Tracker: AAAAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4574 Lines: 130 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 --- 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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/