linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@infradead.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org,
	Adrian Hunter <adrian.hunter@intel.com>,
	David Ahern <dsahern@gmail.com>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Ingo Molnar <mingo@redhat.com>, Jiri Olsa <jolsa@redhat.com>,
	Mike Galbraith <efault@gmx.de>, Namhyung Kim <namhyung@gmail.com>,
	Paul Mackerras <paulus@samba.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Stephane Eranian <eranian@google.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 09/29] perf script: Set up output options for in-stream attributes
Date: Mon,  4 Nov 2013 14:58:47 -0300	[thread overview]
Message-ID: <1383587947-17419-10-git-send-email-acme@infradead.org> (raw)
In-Reply-To: <1383587947-17419-1-git-send-email-acme@infradead.org>

From: Adrian Hunter <adrian.hunter@intel.com>

Attributes (struct perf_event_attr) are recorded separately in the
perf.data file.  perf script uses them to set up output options.
However attributes can also be in the event stream, for example when the
input is a pipe (i.e. live mode).  This patch makes perf script process
in-stream attributes in the same way as on-file attributes.

Here is an example:

Before this patch:

$ perf record uname | perf script
Linux
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.015 MB (null) (~655 samples) ]
:4220  4220 [-01] 2933367.838906: cycles:

:4220  4220 [-01] 2933367.838910: cycles:

:4220  4220 [-01] 2933367.838912: cycles:

:4220  4220 [-01] 2933367.838914: cycles:

:4220  4220 [-01] 2933367.838916: cycles:

:4220  4220 [-01] 2933367.838918: cycles:

uname  4220 [-01] 2933367.838938: cycles:

uname  4220 [-01] 2933367.839207: cycles:

After this patch:

$ perf record uname | perf script
Linux
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.015 MB (null) (~655 samples) ]
           :4582  4582 2933425.707724: cycles:  ffffffff81043ffa native_write_msr_safe ([kernel.kallsyms])
           :4582  4582 2933425.707728: cycles:  ffffffff81043ffa native_write_msr_safe ([kernel.kallsyms])
           :4582  4582 2933425.707730: cycles:  ffffffff81043ffa native_write_msr_safe ([kernel.kallsyms])
           :4582  4582 2933425.707732: cycles:  ffffffff81043ffa native_write_msr_safe ([kernel.kallsyms])
           :4582  4582 2933425.707734: cycles:  ffffffff81043ffa native_write_msr_safe ([kernel.kallsyms])
           :4582  4582 2933425.707736: cycles:  ffffffff81309a24 memcpy ([kernel.kallsyms])
           uname  4582 2933425.707760: cycles:  ffffffff8109c1c7 enqueue_task_fair ([kernel.kallsyms])
           uname  4582 2933425.707978: cycles:  ffffffff81308457 clear_page_c ([kernel.kallsyms])

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1383313899-15987-3-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-script.c | 64 +++++++++++++++++++++++++++++++++------------
 1 file changed, 48 insertions(+), 16 deletions(-)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index b866cc8c3878..baf17989a216 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -229,6 +229,24 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
 	return 0;
 }
 
+static void set_print_ip_opts(struct perf_event_attr *attr)
+{
+	unsigned int type = attr->type;
+
+	output[type].print_ip_opts = 0;
+	if (PRINT_FIELD(IP))
+		output[type].print_ip_opts |= PRINT_IP_OPT_IP;
+
+	if (PRINT_FIELD(SYM))
+		output[type].print_ip_opts |= PRINT_IP_OPT_SYM;
+
+	if (PRINT_FIELD(DSO))
+		output[type].print_ip_opts |= PRINT_IP_OPT_DSO;
+
+	if (PRINT_FIELD(SYMOFFSET))
+		output[type].print_ip_opts |= PRINT_IP_OPT_SYMOFFSET;
+}
+
 /*
  * verify all user requested events exist and the samples
  * have the expected data
@@ -237,7 +255,6 @@ static int perf_session__check_output_opt(struct perf_session *session)
 {
 	int j;
 	struct perf_evsel *evsel;
-	struct perf_event_attr *attr;
 
 	for (j = 0; j < PERF_TYPE_MAX; ++j) {
 		evsel = perf_session__find_first_evtype(session, j);
@@ -260,20 +277,7 @@ static int perf_session__check_output_opt(struct perf_session *session)
 		if (evsel == NULL)
 			continue;
 
-		attr = &evsel->attr;
-
-		output[j].print_ip_opts = 0;
-		if (PRINT_FIELD(IP))
-			output[j].print_ip_opts |= PRINT_IP_OPT_IP;
-
-		if (PRINT_FIELD(SYM))
-			output[j].print_ip_opts |= PRINT_IP_OPT_SYM;
-
-		if (PRINT_FIELD(DSO))
-			output[j].print_ip_opts |= PRINT_IP_OPT_DSO;
-
-		if (PRINT_FIELD(SYMOFFSET))
-			output[j].print_ip_opts |= PRINT_IP_OPT_SYMOFFSET;
+		set_print_ip_opts(&evsel->attr);
 	}
 
 	return 0;
@@ -547,6 +551,34 @@ struct perf_script {
 	struct perf_session	*session;
 };
 
+static int process_attr(struct perf_tool *tool, union perf_event *event,
+			struct perf_evlist **pevlist)
+{
+	struct perf_script *scr = container_of(tool, struct perf_script, tool);
+	struct perf_evlist *evlist;
+	struct perf_evsel *evsel, *pos;
+	int err;
+
+	err = perf_event__process_attr(tool, event, pevlist);
+	if (err)
+		return err;
+
+	evlist = *pevlist;
+	evsel = perf_evlist__last(*pevlist);
+
+	if (evsel->attr.type >= PERF_TYPE_MAX)
+		return 0;
+
+	list_for_each_entry(pos, &evlist->entries, node) {
+		if (pos->attr.type == evsel->attr.type && pos != evsel)
+			return 0;
+	}
+
+	set_print_ip_opts(&evsel->attr);
+
+	return perf_evsel__check_attr(evsel, scr->session);
+}
+
 static void sig_handler(int sig __maybe_unused)
 {
 	session_done = 1;
@@ -1272,7 +1304,7 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
 			.comm		 = perf_event__process_comm,
 			.exit		 = perf_event__process_exit,
 			.fork		 = perf_event__process_fork,
-			.attr		 = perf_event__process_attr,
+			.attr		 = process_attr,
 			.tracing_data	 = perf_event__process_tracing_data,
 			.build_id	 = perf_event__process_build_id,
 			.ordered_samples = true,
-- 
1.8.1.4


  parent reply	other threads:[~2013-11-04 17:59 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-04 17:58 [GIT PULL 00/29] perf/core improvements and fixes Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 01/29] perf probe: Fix typo Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 02/29] perf tools: Add missing data.h into LIB_H headers Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 03/29] perf tools: Use an accessor to read thread comm Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 04/29] perf tools: Add time argument on COMM setting Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 05/29] perf tools: Add new COMM infrastructure Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 06/29] perf tools: Compare hists comm by addresses Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 07/29] perf tools: Get current comm instead of last one Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 08/29] perf evsel: Add a debug print if perf_event_open fails Arnaldo Carvalho de Melo
2013-11-04 17:58 ` Arnaldo Carvalho de Melo [this message]
2013-11-04 17:58 ` [PATCH 10/29] perf tools: Fix 32-bit cross build Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 11/29] perf tools: Fix libunwind build and feature detection for 32-bit build Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 12/29] perf evlist: Add a debug print if event buffer mmap fails Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 13/29] perf evsel: Always use perf_evsel__set_sample_bit() Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 14/29] perf evsel: Add missing overflow check for TRANSACTION Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 15/29] perf test: Update "sample parsing" test for PERF_SAMPLE_TRANSACTION Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 16/29] perf evsel: Synthesize PERF_SAMPLE_TRANSACTION Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 17/29] perf tools: Show single option when failed to parse Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 18/29] perf report: Postpone setting up browser after parsing options Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 19/29] perf report: Use parse_options_usage() for -s option failure Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 20/29] perf top: " Arnaldo Carvalho de Melo
2013-11-04 17:58 ` [PATCH 21/29] perf stat: Enhance option parse error message Arnaldo Carvalho de Melo
2013-11-04 17:59 ` [PATCH 22/29] tools lib traceevent: Add support for extracting trace_clock in report Arnaldo Carvalho de Melo
2013-11-04 17:59 ` [PATCH 23/29] tools lib traceevent: Update printk formats when entered Arnaldo Carvalho de Melo
2013-11-04 17:59 ` [PATCH 24/29] tools lib traceevent: If %s is a pointer, check printk formats Arnaldo Carvalho de Melo
2013-11-04 17:59 ` [PATCH 25/29] tools lib traceevent: Handle __print_hex(__get_dynamic_array(fieldname), len) Arnaldo Carvalho de Melo
2013-11-04 17:59 ` [PATCH 26/29] tools lib traceevent: Have bprintk output the same as the kernel does Arnaldo Carvalho de Melo
2013-11-04 17:59 ` [PATCH 27/29] tools lib traceevent: Check for spaces in character array Arnaldo Carvalho de Melo
2013-11-04 17:59 ` [PATCH 28/29] tools lib traceevent: Add flags NOHANDLE and PRINTRAW to individual events Arnaldo Carvalho de Melo
2013-11-04 17:59 ` [PATCH 29/29] tools lib traceevent: Add pevent_print_func_field() helper function Arnaldo Carvalho de Melo
2013-11-04 20:16 ` [GIT PULL 00/29] perf/core improvements and fixes Ingo Molnar
2013-11-05  7:52   ` Ingo Molnar
2013-11-05  8:05     ` Ingo Molnar

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=1383587947-17419-10-git-send-email-acme@infradead.org \
    --to=acme@infradead.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@redhat.com \
    --cc=adrian.hunter@intel.com \
    --cc=dsahern@gmail.com \
    --cc=efault@gmx.de \
    --cc=eranian@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@gmail.com \
    --cc=paulus@samba.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).