From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org,
Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>,
Brendan Gregg <brendan.d.gregg@gmail.com>,
Hemant Kumar <hemant@linux.vnet.ibm.com>,
Namhyung Kim <namhyung@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 11/19] perf probe: Make --list show only available cached events
Date: Wed, 13 Jul 2016 23:20:47 -0300 [thread overview]
Message-ID: <1468462855-30196-12-git-send-email-acme@kernel.org> (raw)
In-Reply-To: <1468462855-30196-1-git-send-email-acme@kernel.org>
From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Make "perf probe --cache --list" show only available cached events by
checking build-id validity.
E.g. without this patch:
----
$ ./perf probe --cache --add oldevent=cmd_probe
$ make #(to update ./perf)
$ ./perf probe --cache --add newevent=cmd_probe
$ ./perf probe --cache --list
/home/mhiramat/ksrc/linux/tools/perf/perf (061e90539bac69
probe_perf:newevent=cmd_probe
/home/mhiramat/ksrc/linux/tools/perf/perf (c2e44d614e33e1
probe_perf:oldevent=cmd_probe
----
It shows both of old and new events but user can not use old one.
With this;
----
$ ./perf probe --cache -l
/home/mhiramat/ksrc/linux/tools/perf/perf (061e90539bac69
probe_perf:newevent=cmd_probe
----
This shows only new events which are on the existing binary.
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/146831789417.17065.17896487479879669610.stgit@devbox
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-probe.c | 2 +-
tools/perf/util/build-id.c | 33 ++++++++++++++++++++++++++++++++-
tools/perf/util/build-id.h | 2 +-
tools/perf/util/probe-file.c | 2 +-
4 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index c6d890ad2c1a..ee5b42173ba3 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;
- bidlist = build_id_cache__list_all();
+ bidlist = build_id_cache__list_all(false);
if (!bidlist) {
ret = -errno;
pr_debug("Failed to get buildids: %d\n", ret);
diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c
index 1e504e40dac8..36b4279a9002 100644
--- a/tools/perf/util/build-id.c
+++ b/tools/perf/util/build-id.c
@@ -206,6 +206,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");
@@ -433,13 +458,17 @@ static bool lsdir_bid_tail_filter(const char *name __maybe_unused,
return (i == SBUILD_ID_SIZE - 3) && (d->d_name[i] == '\0');
}
-struct strlist *build_id_cache__list_all(void)
+struct strlist *build_id_cache__list_all(bool validonly)
{
struct strlist *toplist, *linklist = NULL, *bidlist;
struct str_node *nd, *nd2;
char *topdir, *linkdir = NULL;
char sbuild_id[SBUILD_ID_SIZE];
+ /* for filename__ functions */
+ if (validonly)
+ symbol__init(NULL);
+
/* Open the top-level directory */
if (asprintf(&topdir, "%s/.build-id/", buildid_dir) < 0)
return NULL;
@@ -470,6 +499,8 @@ struct strlist *build_id_cache__list_all(void)
if (snprintf(sbuild_id, SBUILD_ID_SIZE, "%s%s",
nd->s, nd2->s) != SBUILD_ID_SIZE - 1)
goto err_out;
+ if (validonly && !build_id_cache__valid_id(sbuild_id))
+ continue;
if (strlist__add(bidlist, sbuild_id) < 0)
goto err_out;
}
diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h
index b742e271ea2c..64e740f4bc28 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);
-struct strlist *build_id_cache__list_all(void);
+struct strlist *build_id_cache__list_all(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/probe-file.c b/tools/perf/util/probe-file.c
index fc16b172579f..a5059dc3921a 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -808,7 +808,7 @@ int probe_cache__show_all_caches(struct strfilter *filter)
pr_debug("list cache with filter: %s\n", buf);
free(buf);
- bidlist = build_id_cache__list_all();
+ bidlist = build_id_cache__list_all(true);
if (!bidlist) {
pr_debug("Failed to get buildids: %d\n", errno);
return -EINVAL;
--
2.7.4
next prev parent reply other threads:[~2016-07-14 2:24 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-14 2:20 [GIT PULL 00/19] perf/core improvements and fixes Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 01/19] tools: Fix up BITS_PER_LONG setting Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 02/19] objtool: Add fallback from ELF_C_READ_MMAP to ELF_C_READ Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 03/19] objtool: Avoid checking code drift on busybox's diff Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 04/19] tools lib bpf: New API to adjust type of a BPF program Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 05/19] tools lib bpf: Report error when kernel doesn't support program type Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 06/19] perf event parser: Add const qualifier to evt_name and sys_name Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 07/19] perf bpf: Rename bpf__foreach_tev() to bpf__foreach_event() Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 08/19] perf bpf: Support BPF program attach to tracepoints Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 09/19] perf probe: Fix to show correct error message for $vars and $params Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 10/19] perf probe: Accept %sdt and %cached event name Arnaldo Carvalho de Melo
2016-07-14 2:20 ` Arnaldo Carvalho de Melo [this message]
2016-07-14 2:20 ` [PATCH 12/19] perf probe-cache: Add for_each_probe_cache_entry() wrapper Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 13/19] perf probe: Allow wildcard for cached events Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 14/19] perf probe: Search SDT/cached event from all probe caches Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 15/19] perf list: Show SDT and pre-cached events Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 16/19] perf probe: Support @BUILDID or @FILE suffix for SDT events Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 17/19] perf probe: Support a special SDT probe format Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 18/19] perf build: Add sdt feature detection Arnaldo Carvalho de Melo
2016-07-14 2:20 ` [PATCH 19/19] perf test: Add a test case for SDT event Arnaldo Carvalho de Melo
2016-07-14 6:58 ` [GIT PULL 00/19] perf/core improvements and fixes Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1468462855-30196-12-git-send-email-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=ananth@linux.vnet.ibm.com \
--cc=brendan.d.gregg@gmail.com \
--cc=hemant@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mhiramat@kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.