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>,
Namhyung Kim <namhyung@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 02/19] perf probe: Check kprobes blacklist when adding new events
Date: Fri, 27 Feb 2015 16:22:52 -0300 [thread overview]
Message-ID: <1425064989-26440-3-git-send-email-acme@kernel.org> (raw)
In-Reply-To: <1425064989-26440-1-git-send-email-acme@kernel.org>
From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Recent linux kernel provides a blacklist of the functions which can not
be probed. perf probe can now check this blacklist before setting new
events and indicate better error message for users.
Without this patch,
----
# perf probe --add vmalloc_fault
Added new event:
Failed to write event: Invalid argument
Error: Failed to add events.
----
With this patch
----
# perf probe --add vmalloc_fault
Added new event:
Warning: Skipped probing on blacklisted function: vmalloc_fault
----
Reported-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20150219143113.14434.5387.stgit@localhost.localdomain
Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/probe-event.c | 109 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 108 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 9dfbed96bf39..662d454cb667 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1903,6 +1903,95 @@ static struct strlist *get_probe_trace_command_rawlist(int fd)
return sl;
}
+struct kprobe_blacklist_node {
+ struct list_head list;
+ unsigned long start;
+ unsigned long end;
+ char *symbol;
+};
+
+static void kprobe_blacklist__delete(struct list_head *blacklist)
+{
+ struct kprobe_blacklist_node *node;
+
+ while (!list_empty(blacklist)) {
+ node = list_first_entry(blacklist,
+ struct kprobe_blacklist_node, list);
+ list_del(&node->list);
+ free(node->symbol);
+ free(node);
+ }
+}
+
+static int kprobe_blacklist__load(struct list_head *blacklist)
+{
+ struct kprobe_blacklist_node *node;
+ const char *__debugfs = debugfs_find_mountpoint();
+ char buf[PATH_MAX], *p;
+ FILE *fp;
+ int ret;
+
+ if (__debugfs == NULL)
+ return -ENOTSUP;
+
+ ret = e_snprintf(buf, PATH_MAX, "%s/kprobes/blacklist", __debugfs);
+ if (ret < 0)
+ return ret;
+
+ fp = fopen(buf, "r");
+ if (!fp)
+ return -errno;
+
+ ret = 0;
+ while (fgets(buf, PATH_MAX, fp)) {
+ node = zalloc(sizeof(*node));
+ if (!node) {
+ ret = -ENOMEM;
+ break;
+ }
+ INIT_LIST_HEAD(&node->list);
+ list_add_tail(&node->list, blacklist);
+ if (sscanf(buf, "0x%lx-0x%lx", &node->start, &node->end) != 2) {
+ ret = -EINVAL;
+ break;
+ }
+ p = strchr(buf, '\t');
+ if (p) {
+ p++;
+ if (p[strlen(p) - 1] == '\n')
+ p[strlen(p) - 1] = '\0';
+ } else
+ p = (char *)"unknown";
+ node->symbol = strdup(p);
+ if (!node->symbol) {
+ ret = -ENOMEM;
+ break;
+ }
+ pr_debug2("Blacklist: 0x%lx-0x%lx, %s\n",
+ node->start, node->end, node->symbol);
+ ret++;
+ }
+ if (ret < 0)
+ kprobe_blacklist__delete(blacklist);
+ fclose(fp);
+
+ return ret;
+}
+
+static struct kprobe_blacklist_node *
+kprobe_blacklist__find_by_address(struct list_head *blacklist,
+ unsigned long address)
+{
+ struct kprobe_blacklist_node *node;
+
+ list_for_each_entry(node, blacklist, list) {
+ if (node->start <= address && address <= node->end)
+ return node;
+ }
+
+ return NULL;
+}
+
/* Show an event */
static int show_perf_probe_event(struct perf_probe_event *pev,
const char *module)
@@ -2117,6 +2206,8 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
char buf[64];
const char *event, *group;
struct strlist *namelist;
+ LIST_HEAD(blacklist);
+ struct kprobe_blacklist_node *node;
if (pev->uprobes)
fd = open_uprobe_events(true);
@@ -2134,11 +2225,25 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
pr_debug("Failed to get current event list.\n");
return -EIO;
}
+ /* Get kprobe blacklist if exists */
+ if (!pev->uprobes) {
+ ret = kprobe_blacklist__load(&blacklist);
+ if (ret < 0)
+ pr_debug("No kprobe blacklist support, ignored\n");
+ }
ret = 0;
pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
for (i = 0; i < ntevs; i++) {
tev = &tevs[i];
+ /* Ensure that the address is NOT blacklisted */
+ node = kprobe_blacklist__find_by_address(&blacklist,
+ tev->point.address);
+ if (node) {
+ pr_warning("Warning: Skipped probing on blacklisted function: %s\n", node->symbol);
+ continue;
+ }
+
if (pev->event)
event = pev->event;
else
@@ -2189,13 +2294,15 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
allow_suffix = true;
}
- if (ret >= 0) {
+ /* Note that it is possible to skip all events because of blacklist */
+ if (ret >= 0 && tev->event) {
/* Show how to use the event. */
pr_info("\nYou can now use it in all perf tools, such as:\n\n");
pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", tev->group,
tev->event);
}
+ kprobe_blacklist__delete(&blacklist);
strlist__delete(namelist);
close(fd);
return ret;
--
1.9.3
next prev parent reply other threads:[~2015-02-27 19:23 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-27 19:22 [GIT PULL 00/19] perf/core improvements and fixes Arnaldo Carvalho de Melo
2015-02-27 19:22 ` [PATCH 01/19] perf trace: Fix SIGBUS failures due to misaligned accesses Arnaldo Carvalho de Melo
2015-02-27 19:22 ` Arnaldo Carvalho de Melo [this message]
2015-02-27 19:22 ` [PATCH 03/19] perf probe: Fix get_real_path to free allocated memory in error path Arnaldo Carvalho de Melo
2015-02-27 19:22 ` [PATCH 04/19] perf probe: Handle strdup() failure Arnaldo Carvalho de Melo
2015-02-27 19:22 ` [PATCH 05/19] perf buildid-cache: Add new buildid cache if update target is not cached Arnaldo Carvalho de Melo
2015-02-27 19:22 ` [PATCH 06/19] perf diff: Support for different binaries Arnaldo Carvalho de Melo
2015-02-27 19:22 ` [PATCH 07/19] perf probe: Fix a precedence bug Arnaldo Carvalho de Melo
2015-02-27 19:22 ` [PATCH 08/19] perf data: Fix sentinel setting for data_cmds array Arnaldo Carvalho de Melo
2015-02-27 19:22 ` [PATCH 09/19] perf list: Sort the output of 'perf list' to view more clearly Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 10/19] perf list: Allow listing events with 'tracepoint' prefix Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 11/19] perf list: Avoid confusion of perf output and the next command prompt Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 12/19] perf tools: Remove the '--(null)' long_name for --list-opts Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 13/19] perf list: Clean up the printing functions of hardware/software events Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 14/19] perf list: Extend raw-dump to certain kind of events Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 15/19] perf tools: Fix the bash completion problem of 'perf --*' Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 16/19] perf buildid-cache: Add --purge FILE to remove all caches of FILE Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 17/19] perf buildid-cache: Use pr_debug instead of verbose && pr_info Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 18/19] perf buildid-cache: Show usage with incorrect params Arnaldo Carvalho de Melo
2015-02-27 19:23 ` [PATCH 19/19] perf report: Fix branch stack mode cannot be set Arnaldo Carvalho de Melo
2015-02-28 7:49 ` [PATCH] perf tools: Fix pthread_attr_setaffinity_np() feature detection on Ubuntu systems Ingo Molnar
2015-02-28 22:57 ` Jiri Olsa
2015-03-01 16:11 ` Ingo Molnar
2015-02-28 8:12 ` [PATCH] perf tools: Add PERF-FEATURES to the .gitignore file Ingo Molnar
2015-02-28 8:17 ` [PATCH] perf tools: Remove annoying extra message from the features build Ingo Molnar
2015-03-03 6:24 ` [tip:perf/core] " tip-bot for Ingo Molnar
2015-02-28 8:33 ` [PATCH] perf tools: Improve Python feature detection messages Ingo Molnar
2015-03-02 15:10 ` Arnaldo Carvalho de Melo
2015-03-03 13:01 ` Ingo Molnar
2015-03-03 6:24 ` [tip:perf/core] " tip-bot for Ingo Molnar
2015-02-28 8:39 ` [PATCH] perf tools: Improve libperl detection message Ingo Molnar
2015-03-03 6:24 ` [tip:perf/core] " tip-bot for Ingo Molnar
2015-02-28 8:41 ` [PATCH] perf tools: Improve libbfd " Ingo Molnar
2015-02-28 8:46 ` [PATCH v2] " Ingo Molnar
2015-03-03 6:24 ` [tip:perf/core] " tip-bot for Ingo Molnar
2015-02-28 9:16 ` [PATCH] perf tools: Improve feature test debuggability Ingo Molnar
2015-03-03 6:25 ` [tip:perf/core] " tip-bot for Ingo Molnar
2015-02-28 9:18 ` [PATCH] perf tools: Improve 'libbabel' feature check failure message Ingo Molnar
2015-03-02 15:19 ` Arnaldo Carvalho de Melo
2015-03-03 13:02 ` Ingo Molnar
2015-03-03 6:25 ` [tip:perf/core] " tip-bot for Ingo Molnar
2015-03-03 6:23 ` [tip:perf/core] perf tools: Add PERF-FEATURES to the .gitignore file tip-bot for 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=1425064989-26440-3-git-send-email-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=masami.hiramatsu.pt@hitachi.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome