From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1162007AbcFHJbr (ORCPT ); Wed, 8 Jun 2016 05:31:47 -0400 Received: from mail.kernel.org ([198.145.29.136]:46783 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161803AbcFHJbp (ORCPT ); Wed, 8 Jun 2016 05:31:45 -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 , Brendan Gregg Subject: [PATCH perf/core v10 16/23] perf-list: Skip SDTs placed in invalid binaries Date: Wed, 8 Jun 2016 18:31:39 +0900 Message-Id: <20160608093138.3116.97718.stgit@devbox> X-Mailer: git-send-email 2.1.0 In-Reply-To: <20160608092854.3116.29007.stgit@devbox> References: <20160608092854.3116.29007.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 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 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 68a67eb..424f4e2 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 4c7437f..5932b58 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -2002,7 +2002,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 a222fb2..4d8ba72 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -781,7 +781,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;