Skip to contentSkip to conversation

perf-probe: Allow probing on kmodules without dwarf

PATCH Applied Masami Hiramatsu 3 participants 3 messages Oct 2, 2015 – Oct 3, 2015 perf events

lore
Share & tools
lore
#0 lore raw

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
index f7882ae..530c3a2 100644
@@ -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
index 3010abc..b51a8bf 100644
@@ -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++;
maintainer Applied
#1 lore raw

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

#2 lore raw

[tip:perf/core] perf probe: Allow probing on kmodules without dwarf

In reply to Masami Hiramatsu
perf 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
index f7882ae..530c3a2 100644
@@ -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
index 3010abc..b51a8bf 100644
@@ -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++;