From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933054AbbDKGif (ORCPT ); Sat, 11 Apr 2015 02:38:35 -0400 Received: from terminus.zytor.com ([198.137.202.10]:51128 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932949AbbDKGib (ORCPT ); Sat, 11 Apr 2015 02:38:31 -0400 Date: Fri, 10 Apr 2015 23:37:51 -0700 From: tip-bot for Masami Hiramatsu Message-ID: Cc: masami.hiramatsu.pt@hitachi.com, tglx@linutronix.de, peterz@infradead.org, mingo@kernel.org, acme@redhat.com, namhyung@kernel.org, dsahern@gmail.com, linux-kernel@vger.kernel.org, hpa@zytor.com, jolsa@redhat.com, acme@infradead.org Reply-To: acme@redhat.com, peterz@infradead.org, mingo@kernel.org, masami.hiramatsu.pt@hitachi.com, tglx@linutronix.de, acme@infradead.org, jolsa@redhat.com, linux-kernel@vger.kernel.org, dsahern@gmail.com, hpa@zytor.com, namhyung@kernel.org In-Reply-To: <20150401102539.17137.46454.stgit@localhost.localdomain> References: <20150401102539.17137.46454.stgit@localhost.localdomain> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf probe: Support multiple probes on different binaries Git-Commit-ID: 7afb3fab390871b1d20b1dbb94e03b8a3861cb0d X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 7afb3fab390871b1d20b1dbb94e03b8a3861cb0d Gitweb: http://git.kernel.org/tip/7afb3fab390871b1d20b1dbb94e03b8a3861cb0d Author: Masami Hiramatsu AuthorDate: Wed, 1 Apr 2015 19:25:39 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Fri, 10 Apr 2015 10:19:53 -0300 perf probe: Support multiple probes on different binaries Support multiple probes on different binaries with just one command. In the result, this example sets up the probes on icmp_rcv in kernel, on main and set_target in perf, and on pcspkr_event in pcspker.ko driver. ----- # perf probe -a icmp_rcv -x ./perf -a main -a set_target \ -m /lib/modules/4.0.0-rc5+/kernel/drivers/input/misc/pcspkr.ko \ -a pcspkr_event Added new event: probe:icmp_rcv (on icmp_rcv) You can now use it in all perf tools, such as: perf record -e probe:icmp_rcv -aR sleep 1 Added new event: probe_perf:main (on main in /home/mhiramat/ksrc/linux-3/tools/perf/perf) You can now use it in all perf tools, such as: perf record -e probe_perf:main -aR sleep 1 Added new event: probe_perf:set_target (on set_target in /home/mhiramat/ksrc/linux-3/tools/perf/perf) You can now use it in all perf tools, such as: perf record -e probe_perf:set_target -aR sleep 1 Added new event: probe:pcspkr_event (on pcspkr_event in pcspkr) You can now use it in all perf tools, such as: perf record -e probe:pcspkr_event -aR sleep 1 ----- Reported-by: Arnaldo Carvalho de Melo Signed-off-by: Masami Hiramatsu Tested-by: Arnaldo Carvalho de Melo Cc: David Ahern Cc: Jiri Olsa Cc: Namhyung Kim Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/20150401102539.17137.46454.stgit@localhost.localdomain Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-probe.c | 9 +++++++-- tools/perf/util/probe-event.c | 5 +++-- tools/perf/util/probe-event.h | 6 +++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index 921bb69..2df23e1 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c @@ -78,6 +78,11 @@ static int parse_probe_event(const char *str) } pev->uprobes = params.uprobes; + if (params.target) { + pev->target = strdup(params.target); + if (!pev->target) + return -ENOMEM; + } /* Parse a perf-probe command into event */ ret = parse_perf_probe_command(str, pev); @@ -178,7 +183,7 @@ static int opt_set_target(const struct option *opt, const char *str, int ret = -ENOENT; char *tmp; - if (str && !params.target) { + if (str) { if (!strcmp(opt->long_name, "exec")) params.uprobes = true; #ifdef HAVE_DWARF_SUPPORT @@ -200,6 +205,7 @@ static int opt_set_target(const struct option *opt, const char *str, if (!tmp) return -ENOMEM; } + free(params.target); params.target = tmp; ret = 0; } @@ -487,7 +493,6 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) if (params.nevents) { ret = add_perf_probe_events(params.events, params.nevents, params.max_probe_points, - params.target, params.force_add); if (ret < 0) { pr_err_with_code(" Error: Failed to add events.", ret); diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index b788517..30545ce 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -1906,6 +1906,7 @@ void clear_perf_probe_event(struct perf_probe_event *pev) free(pev->event); free(pev->group); + free(pev->target); clear_perf_probe_point(&pev->point); for (i = 0; i < pev->nargs; i++) { @@ -2654,7 +2655,7 @@ struct __event_package { }; int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, - int max_tevs, const char *target, bool force_add) + int max_tevs, bool force_add) { int i, j, ret; struct __event_package *pkgs; @@ -2678,7 +2679,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, ret = convert_to_probe_trace_events(pkgs[i].pev, &pkgs[i].tevs, max_tevs, - target); + pkgs[i].pev->target); if (ret < 0) goto end; pkgs[i].ntevs = ret; diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h index e01e994..d6b7834 100644 --- a/tools/perf/util/probe-event.h +++ b/tools/perf/util/probe-event.h @@ -73,7 +73,8 @@ struct perf_probe_event { char *group; /* Group name */ struct perf_probe_point point; /* Probe point */ int nargs; /* Number of arguments */ - bool uprobes; + bool uprobes; /* Uprobe event flag */ + char *target; /* Target binary */ struct perf_probe_arg *args; /* Arguments */ }; @@ -124,8 +125,7 @@ extern int line_range__init(struct line_range *lr); extern const char *kernel_get_module_path(const char *module); extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, - int max_probe_points, const char *module, - bool force_add); + int max_probe_points, bool force_add); extern int del_perf_probe_events(struct strlist *dellist); extern int show_perf_probe_events(void); extern int show_line_range(struct line_range *lr, const char *module,