perf-probe: Allow probing on kmodules without dwarf
PATCH 1/1 perf-probe: Allow probing on kmodules without dwarf
Allow probing on kernel modules without debuginfo support. Currently perf-probe --module requires libdw support, but it does not make sense.
E.g.
----
# make NO_DWARF=1
# ./perf probe -m pcspkr pcspkr_event%return
Error: unknown switch `m'
----With this patch
----
# ./perf probe -m pcspkr pcspkr_event%return
Added new event:
probe:pcspkr_event (on pcspkr_event%return in pcspkr)You can now use it in all perf tools, such as:
perf record -e probe:pcspkr_event -aR sleep 1
----
--- tools/perf/builtin-probe.c | 8 +++----- tools/perf/util/probe-event.c | 8 +++++--- 2 files changed, 8 insertions(+), 8 deletions(-)
tools/perf/builtin-probe.c +3 -5
@@ -182,10 +182,8 @@ static int opt_set_target(const struct option *opt, const char *str,if (str) {if (!strcmp (opt->long_name,"exec" )) params.uprobes = true; -#ifdef HAVE_DWARF_SUPPORT else if (!strcmp (opt->long_name,"module" )) params.uprobes = false; -#endif else return ret;
@@ -490,9 +488,6 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) "file", "vmlinux pathname"), OPT_STRING('s', "source", &symbol_conf.source_prefix, "directory", "path to kernel source"), -OPT_CALLBACK ('m' ,"module" ,NULL ,"modname|path" , -"target module name (for online) or path (for offline)" , - opt_set_target), OPT_BOOLEAN('\0', "no-inlines", &probe_conf.no_inlines, "Don't search inlined functions"),#endif
@@ -509,6 +504,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) opt_set_filter),OPT_CALLBACK ('x' ,"exec" ,NULL ,"executable|path" ,"target executable name or path" , opt_set_target), +OPT_CALLBACK ('m' ,"module" ,NULL ,"modname|path" , +"target module name (for online) or path (for offline)" , + opt_set_target),OPT_BOOLEAN (0 ,"demangle" , &symbol_conf.demangle,"Enable symbol demangling" ), OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel,
tools/perf/util/probe-event.c +5 -3
@@ -2543,7 +2543,8 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, goto out; } -if (!pev->uprobes && !pp->retprobe) { +/* Note that the symbols in the kmodule are not relocated */ +if (!pev->uprobes && !pp->retprobe && !pev->target) { reloc_sym =kernel_get_ref_reloc_sym ();if (!reloc_sym) {pr_warning ("Relocated base symbol is not found!\n" );
@@ -2580,8 +2581,9 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, }/* Add one probe point */ tp->address = map->unmap_ip (map, sym->start) + pp->offset; -/* If we found a wrong one, mark it by NULL symbol */ -if (!pev->uprobes && + +/* Check the kprobe (not in module) is within .text */ +if (!pev->uprobes && !pev->target &&kprobe_warn_out_range (sym->name, tp->address)) { tp->symbol =NULL ;/* Skip it */ skipped++;
Em Fri, Oct 02, 2015 at 09:58:32PM +0900, Masami Hiramatsu escreveu:
Quoted 3 lines
Allow probing on kernel modules without debuginfo support. Currently perf-probe --module requires libdw support, but it does not make sense.
Thanks, applied.
- Arnaldo
tip-bot for Masami Hiramatsu
merge bot[tip:perf/core] perf probe: Allow probing on kmodules without dwarf
In reply to Masami Hiramatsuperf probe: Allow probing on kmodules without dwarf
Commit-ID: 1a8ac29cbffc261f6d7c92e573878110a7dcbd94 Gitweb: http://git.kernel.org/tip/1a8ac29cbffc261f6d7c92e573878110a7dcbd94 Author: Masami Hiramatsu <[email protected]> AuthorDate: Fri, 2 Oct 2015 21:58:32 +0900 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 2 Oct 2015 15:59:23 -0300
perf probe: Allow probing on kmodules without dwarf
Allow probing on kernel modules when 'perf' is built without debuginfo support.
Currently perf-probe --module requires linking with libdw, but this doesn't make sense.
E.g.
----
# make NO_DWARF=1
# ./perf probe -m pcspkr pcspkr_event%return
Error: unknown switch `m'
----With this patch
----
# ./perf probe -m pcspkr pcspkr_event%return
Added new event:
probe:pcspkr_event (on pcspkr_event%return in pcspkr)You can now use it in all perf tools, such as:
perf record -e probe:pcspkr_event -aR sleep 1
----
--- tools/perf/builtin-probe.c | 8 +++----- tools/perf/util/probe-event.c | 8 +++++--- 2 files changed, 8 insertions(+), 8 deletions(-)
tools/perf/builtin-probe.c +3 -5
@@ -182,10 +182,8 @@ static int opt_set_target(const struct option *opt, const char *str,if (str) {if (!strcmp (opt->long_name,"exec" )) params.uprobes = true; -#ifdef HAVE_DWARF_SUPPORT else if (!strcmp (opt->long_name,"module" )) params.uprobes = false; -#endif else return ret;
@@ -490,9 +488,6 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) "file", "vmlinux pathname"), OPT_STRING('s', "source", &symbol_conf.source_prefix, "directory", "path to kernel source"), -OPT_CALLBACK ('m' ,"module" ,NULL ,"modname|path" , -"target module name (for online) or path (for offline)" , - opt_set_target), OPT_BOOLEAN('\0', "no-inlines", &probe_conf.no_inlines, "Don't search inlined functions"),#endif
@@ -509,6 +504,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) opt_set_filter),OPT_CALLBACK ('x' ,"exec" ,NULL ,"executable|path" ,"target executable name or path" , opt_set_target), +OPT_CALLBACK ('m' ,"module" ,NULL ,"modname|path" , +"target module name (for online) or path (for offline)" , + opt_set_target),OPT_BOOLEAN (0 ,"demangle" , &symbol_conf.demangle,"Enable symbol demangling" ), OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel,
tools/perf/util/probe-event.c +5 -3
@@ -2543,7 +2543,8 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, goto out; } -if (!pev->uprobes && !pp->retprobe) { +/* Note that the symbols in the kmodule are not relocated */ +if (!pev->uprobes && !pp->retprobe && !pev->target) { reloc_sym =kernel_get_ref_reloc_sym ();if (!reloc_sym) {pr_warning ("Relocated base symbol is not found!\n" );
@@ -2580,8 +2581,9 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, }/* Add one probe point */ tp->address = map->unmap_ip (map, sym->start) + pp->offset; -/* If we found a wrong one, mark it by NULL symbol */ -if (!pev->uprobes && + +/* Check the kprobe (not in module) is within .text */ +if (!pev->uprobes && !pev->target &&kprobe_warn_out_range (sym->name, tp->address)) { tp->symbol =NULL ;/* Skip it */ skipped++;