Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752913AbcDZJE6 (ORCPT ); Tue, 26 Apr 2016 05:04:58 -0400 Received: from mail.kernel.org ([198.145.29.136]:47517 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752893AbcDZJE4 (ORCPT ); Tue, 26 Apr 2016 05:04:56 -0400 From: Masami Hiramatsu To: Arnaldo Carvalho de Melo Cc: Masami Hiramatsu , linux-kernel@vger.kernel.org, Namhyung Kim , Peter Zijlstra , Ingo Molnar , Hemant Kumar , Ananth N Mavinakayanahalli Subject: [PATCH perf/core v4 17/19] perf-list: Skip SDTs placed in invalid binaries Date: Tue, 26 Apr 2016 18:04:50 +0900 Message-Id: <20160426090450.11891.73025.stgit@devbox> X-Mailer: git-send-email 2.1.0 In-Reply-To: <20160426090200.11891.43944.stgit@devbox> References: <20160426090200.11891.43944.stgit@devbox> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4542 Lines: 131 From: Masami Hiramatsu 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 Signed-off-by: Masami Hiramatsu --- Changes in v4: - Rename a parameter 'valid' to 'validonly' :) --- tools/perf/builtin-probe.c | 2 +- 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-file.c | 2 +- 5 files changed, 30 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 49a467b9..c849253 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -184,6 +184,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"); @@ -394,7 +413,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; @@ -402,6 +421,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; @@ -431,6 +454,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 2c98a39..5e29cfc 100644 --- a/tools/perf/util/build-id.h +++ b/tools/perf/util/build-id.h @@ -32,7 +32,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 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 ee560dd..2437b48 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -770,7 +770,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;