All of lore.kernel.org
 help / color / mirror / Atom feed
From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
To: Steven Rostedt <rostedt@goodmis.org>,
	Arnaldo Carvalho de Melo <acme@redhat.com>,
	Ingo Molnar <mingo@elte.hu>
Cc: Frederic Weisbecker <fweisbec@gmail.com>,
	Peter Zijlstra <peterz@infradead.org>,
	linux-kernel@vger.kernel.org, yrl.pp-manager.tt@hitachi.com,
	Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Paul Mackerras <paulus@samba.org>, Ingo Molnar <mingo@elte.hu>,
	Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Subject: [PATCH -tip 12/13] perf probe: Add probed module in front of function
Date: Mon, 27 Jun 2011 16:27:45 +0900	[thread overview]
Message-ID: <20110627072745.6528.26416.stgit@fedora15> (raw)
In-Reply-To: <20110627072626.6528.41792.stgit@fedora15>

Add probed module name and ":" in front of function name
if -m module option is given. In the result, the symbol
name passed to kprobe-tracer becomes MODULE:FUNCTION,
so that kallsyms can solve it as a symbol in the module
correctly.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
---

 tools/perf/util/probe-event.c |   47 +++++++++++++++++++++++++++++++++--------
 tools/perf/util/probe-event.h |    1 +
 2 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 920c195..ee3f41e 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -226,14 +226,26 @@ static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp,
 	return 0;
 }
 
+static int add_module_to_probe_trace_events(struct probe_trace_event *tevs,
+					    int ntevs, const char *module)
+{
+	int i;
+	for (i = 0; i < ntevs; i++) {
+		tevs[i].point.module = strdup(module);
+		if (!tevs[i].point.module)
+			return -ENOMEM;
+	}
+	return 0;
+}
+
 /* Try to find perf_probe_event with debuginfo */
 static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
-					   struct probe_trace_event **tevs,
-					   int max_tevs, const char *module)
+					  struct probe_trace_event **tevs,
+					  int max_tevs, const char *module)
 {
 	bool need_dwarf = perf_probe_event_need_dwarf(pev);
 	struct debuginfo *dinfo = open_debuginfo(module);
-	int ntevs;
+	int ntevs, ret = 0;
 
 	if (!dinfo) {
 		if (need_dwarf) {
@@ -251,7 +263,10 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
 
 	if (ntevs > 0) {	/* Succeeded to find trace events */
 		pr_debug("find %d probe_trace_events.\n", ntevs);
-		return ntevs;
+		if (module)
+			ret = add_module_to_probe_trace_events(*tevs, ntevs,
+							       module);
+		return ret < 0 ? ret : ntevs;
 	}
 
 	if (ntevs == 0)	{	/* No error but failed to find probe point. */
@@ -1010,7 +1025,7 @@ bool perf_probe_event_need_dwarf(struct perf_probe_event *pev)
 
 /* Parse probe_events event into struct probe_point */
 static int parse_probe_trace_command(const char *cmd,
-					struct probe_trace_event *tev)
+				     struct probe_trace_event *tev)
 {
 	struct probe_trace_point *tp = &tev->point;
 	char pr;
@@ -1043,8 +1058,14 @@ static int parse_probe_trace_command(const char *cmd,
 
 	tp->retprobe = (pr == 'r');
 
-	/* Scan function name and offset */
-	ret = sscanf(argv[1], "%a[^+]+%lu", (float *)(void *)&tp->symbol,
+	/* Scan module name(if there), function name and offset */
+	p = strchr(argv[1], ':');
+	if (p) {
+		tp->module = strndup(argv[1], p - argv[1]);
+		p++;
+	} else
+		p = argv[1];
+	ret = sscanf(p, "%a[^+]+%lu", (float *)(void *)&tp->symbol,
 		     &tp->offset);
 	if (ret == 1)
 		tp->offset = 0;
@@ -1289,9 +1310,10 @@ char *synthesize_probe_trace_command(struct probe_trace_event *tev)
 	if (buf == NULL)
 		return NULL;
 
-	len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s %s+%lu",
+	len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s %s%s%s+%lu",
 			 tp->retprobe ? 'r' : 'p',
 			 tev->group, tev->event,
+			 tp->module ?: "", tp->module ? ":" : "",
 			 tp->symbol, tp->offset);
 	if (len <= 0)
 		goto error;
@@ -1398,6 +1420,8 @@ static void clear_probe_trace_event(struct probe_trace_event *tev)
 		free(tev->group);
 	if (tev->point.symbol)
 		free(tev->point.symbol);
+	if (tev->point.module)
+		free(tev->point.module);
 	for (i = 0; i < tev->nargs; i++) {
 		if (tev->args[i].name)
 			free(tev->args[i].name);
@@ -1749,7 +1773,7 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
 	/* Convert perf_probe_event with debuginfo */
 	ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, module);
 	if (ret != 0)
-		return ret;
+		return ret;	/* Found in debuginfo or got an error */
 
 	/* Allocate trace event buffer */
 	tev = *tevs = zalloc(sizeof(struct probe_trace_event));
@@ -1762,6 +1786,11 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
 		ret = -ENOMEM;
 		goto error;
 	}
+	tev->point.module = strdup(module);
+	if (tev->point.module == NULL) {
+		ret = -ENOMEM;
+		goto error;
+	}
 	tev->point.offset = pev->point.offset;
 	tev->point.retprobe = pev->point.retprobe;
 	tev->nargs = pev->nargs;
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 3434fc9..a7dee83 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -10,6 +10,7 @@ extern bool probe_event_dry_run;
 /* kprobe-tracer tracing point */
 struct probe_trace_point {
 	char		*symbol;	/* Base symbol */
+	char		*module;	/* Module name */
 	unsigned long	offset;		/* Offset from symbol */
 	bool		retprobe;	/* Return probe flag */
 };


  parent reply	other threads:[~2011-06-28 12:04 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-27  7:26 [PATCH -tip 00/13]tracing/kprobes: Dynamic events on module support Masami Hiramatsu
2011-06-27  7:26 ` [PATCH -tip 01/13] [CLEANUP]tracing/kprobes: Rename probe_* to trace_probe_* Masami Hiramatsu
2011-07-21 10:01   ` [tip:perf/core] tracing/kprobes: " tip-bot for Masami Hiramatsu
2011-06-27  7:26 ` [PATCH -tip 02/13] [CLEANUP]tracing/kprobes: merge trace probe enable/disable functions Masami Hiramatsu
2011-07-08 16:37   ` Steven Rostedt
2011-07-09  4:41     ` Masami Hiramatsu
2011-07-15 17:27   ` Steven Rostedt
2011-07-16 10:30     ` Masami Hiramatsu
2011-07-16 10:33     ` [PATCH -tip v2] " Masami Hiramatsu
2011-07-16 11:11       ` Steven Rostedt
2011-07-21 10:01   ` [tip:perf/core] tracing/kprobes: Merge " tip-bot for Masami Hiramatsu
2011-06-27  7:26 ` [PATCH -tip 03/13] kprobes: Return -ENOENT if probe point doesn't exist Masami Hiramatsu
2011-06-28 13:03   ` Ananth N Mavinakayanahalli
2011-07-21 10:02   ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2011-06-27  7:26 ` [PATCH -tip 04/13] tracing/kprobes: Support module init function probing Masami Hiramatsu
2011-07-21 10:02   ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2011-06-27  7:27 ` [PATCH -tip 05/13] tracing/kprobe: Update symbol reference when loading module Masami Hiramatsu
2011-07-21 10:02   ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2011-06-27  7:27 ` [PATCH -tip 06/13] [RESEND][CLEANUP]perf probe: Rename DIE_FIND_CB_FOUND to DIE_FIND_CB_END Masami Hiramatsu
2011-07-21 10:03   ` [tip:perf/core] perf " tip-bot for Masami Hiramatsu
2011-06-27  7:27 ` [PATCH -tip 07/13] [RESEND][CLEANUP]perf probe: Move strtailcmp to string.c Masami Hiramatsu
2011-07-21 10:03   ` [tip:perf/core] perf " tip-bot for Masami Hiramatsu
2011-06-27  7:27 ` [PATCH -tip 08/13] [RESEND][CLEANUP]perf probe: Remove redundant dwarf functions Masami Hiramatsu
2011-07-21 10:04   ` [tip:perf/core] perf " tip-bot for Masami Hiramatsu
2011-06-27  7:27 ` [PATCH -tip 09/13] [RESEND][CLEANUP]perf-probe: Move dwarf library routines to dwarf-aux.{c, h} Masami Hiramatsu
2011-07-21 10:04   ` [tip:perf/core] perf-probe: " tip-bot for Masami Hiramatsu
2011-06-27  7:27 ` [PATCH -tip 10/13] [RESEND]perf probe: Warn when more than two lines are given Masami Hiramatsu
2011-06-28 14:15   ` David Ahern
2011-06-29  5:14     ` Masami Hiramatsu
2011-06-27  7:27 ` [PATCH -tip 11/13] [RESEND]perf probe: Introduce debuginfo to encapsulate dwarf information Masami Hiramatsu
2011-07-21 10:05   ` [tip:perf/core] perf " tip-bot for Masami Hiramatsu
2011-06-27  7:27 ` Masami Hiramatsu [this message]
2011-07-21 10:05   ` [tip:perf/core] perf probe: Add probed module in front of function tip-bot for Masami Hiramatsu
2011-06-27  7:27 ` [PATCH -tip 13/13] perf probe: Support adding probes on offline kernel modules Masami Hiramatsu
2011-07-21 10:06   ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2011-06-28 13:18 ` [PATCH -tip 00/13]tracing/kprobes: Dynamic events on module support Steven Rostedt
2011-07-15 11:28 ` Steven Rostedt
2011-07-15 12:26   ` Masami Hiramatsu

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=20110627072745.6528.26416.stgit@fedora15 \
    --to=masami.hiramatsu.pt@hitachi.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@ghostprotocols.net \
    --cc=acme@redhat.com \
    --cc=fweisbec@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=paulus@samba.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=yrl.pp-manager.tt@hitachi.com \
    /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.