aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>2014-09-17 04:40:54 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-09-17 17:01:14 -0400
commit2b394bc4468c2f5e6814a8dbb2a923c0448f8497 (patch)
tree9e118f2c74d2650eafb89b61a21ffe5bfdbb6384 /tools
parentc657f423aed0d836c807ea1d6d8d28b3914446fa (diff)
perf probe: Do not access kallsyms when analyzing user binaries
Do not access kallsyms to show available variables and show source lines in user binaries. This behavior always requires the root privilege when sysctl sets kernel.kptr_restrict=1, but we don't need it just for analyzing user binaries. Without this patch (by normal user, kptr_restrict=1): ---- $ perf probe -x ./perf -V add_cmdname Failed to init vmlinux path. Error: Failed to show vars. $ perf probe -x ./perf -L add_cmdname Failed to init vmlinux path. Error: Failed to show lines. ---- With this patch: ---- $ perf probe -x ./perf -V add_cmdname Available variables at add_cmdname @<perf_unknown_cmd_config+144> (No matched variables) @<list_commands_in_dir+160> (No matched variables) @<add_cmdname+0> char* name size_t len struct cmdnames* cmds $ perf probe -x ./perf -L add_cmdname <add_cmdname@/home/fedora/ksrc/linux-3/tools/perf/util/help.c:0> 0 void add_cmdname(struct cmdnames *cmds, const char *name, size_t len) 1 { 2 struct cmdname *ent = malloc(sizeof(*ent) + len + 1); 4 ent->len = len; 5 memcpy(ent->name, name, len); 6 ent->name[len] = 0; ... ---- Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: david lerner <dlernerdroid@gmail.com> Cc: linux-perf-user@vger.kernel.org Cc: yrl.pp-manager.tt@hitachi.com Link: http://lkml.kernel.org/r/20140917084054.3722.73975.stgit@kbuild-f20.novalocal [ Added missing 'bool user' argument to the !DWARF show_line_range() stub ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/builtin-probe.c3
-rw-r--r--tools/perf/util/probe-event.c9
-rw-r--r--tools/perf/util/probe-event.h3
3 files changed, 9 insertions, 6 deletions
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index 4d6858dbebea..04412b4770a2 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -472,7 +472,8 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
472 usage_with_options(probe_usage, options); 472 usage_with_options(probe_usage, options);
473 } 473 }
474 474
475 ret = show_line_range(&params.line_range, params.target); 475 ret = show_line_range(&params.line_range, params.target,
476 params.uprobes);
476 if (ret < 0) 477 if (ret < 0)
477 pr_err_with_code(" Error: Failed to show lines.", ret); 478 pr_err_with_code(" Error: Failed to show lines.", ret);
478 return ret; 479 return ret;
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index f73595fc0627..be37b5aca335 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -697,11 +697,11 @@ end:
697 return ret; 697 return ret;
698} 698}
699 699
700int show_line_range(struct line_range *lr, const char *module) 700int show_line_range(struct line_range *lr, const char *module, bool user)
701{ 701{
702 int ret; 702 int ret;
703 703
704 ret = init_symbol_maps(false); 704 ret = init_symbol_maps(user);
705 if (ret < 0) 705 if (ret < 0)
706 return ret; 706 return ret;
707 ret = __show_line_range(lr, module); 707 ret = __show_line_range(lr, module);
@@ -776,7 +776,7 @@ int show_available_vars(struct perf_probe_event *pevs, int npevs,
776 int i, ret = 0; 776 int i, ret = 0;
777 struct debuginfo *dinfo; 777 struct debuginfo *dinfo;
778 778
779 ret = init_symbol_maps(false); 779 ret = init_symbol_maps(pevs->uprobes);
780 if (ret < 0) 780 if (ret < 0)
781 return ret; 781 return ret;
782 782
@@ -822,7 +822,8 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
822} 822}
823 823
824int show_line_range(struct line_range *lr __maybe_unused, 824int show_line_range(struct line_range *lr __maybe_unused,
825 const char *module __maybe_unused) 825 const char *module __maybe_unused,
826 bool user __maybe_unused)
826{ 827{
827 pr_warning("Debuginfo-analysis is not supported.\n"); 828 pr_warning("Debuginfo-analysis is not supported.\n");
828 return -ENOSYS; 829 return -ENOSYS;
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 776c9347a3b6..e01e9943139f 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -128,7 +128,8 @@ extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
128 bool force_add); 128 bool force_add);
129extern int del_perf_probe_events(struct strlist *dellist); 129extern int del_perf_probe_events(struct strlist *dellist);
130extern int show_perf_probe_events(void); 130extern int show_perf_probe_events(void);
131extern int show_line_range(struct line_range *lr, const char *module); 131extern int show_line_range(struct line_range *lr, const char *module,
132 bool user);
132extern int show_available_vars(struct perf_probe_event *pevs, int npevs, 133extern int show_available_vars(struct perf_probe_event *pevs, int npevs,
133 int max_probe_points, const char *module, 134 int max_probe_points, const char *module,
134 struct strfilter *filter, bool externs); 135 struct strfilter *filter, bool externs);