linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Adrian Hunter <adrian.hunter@intel.com>
To: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Ingo Molnar <mingo@redhat.com>,
	linux-kernel@vger.kernel.org, David Ahern <dsahern@gmail.com>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Jiri Olsa <jolsa@redhat.com>, Mike Galbraith <efault@gmx.de>,
	Namhyung Kim <namhyung@gmail.com>,
	Paul Mackerras <paulus@samba.org>,
	Stephane Eranian <eranian@google.com>
Subject: [PATCH 19/19] perf tools: allow non-matching sample types
Date: Fri, 18 Oct 2013 15:29:16 +0300	[thread overview]
Message-ID: <1382099356-4918-20-git-send-email-adrian.hunter@intel.com> (raw)
In-Reply-To: <1382099356-4918-1-git-send-email-adrian.hunter@intel.com>

For kernels that do not support PERF_SAMPLE_IDENTIFIER,
sample types need not be identical to determine
the sample id from the event.  Only the position
of the sample id needs to be the same.

Compatible sample types are ones in which the bits
defined by PERF_COMPAT_MASK are the same.
'perf_evlist__config()' forces sample types to be
compatible on that basis.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
 tools/perf/util/event.h  | 16 ++++++++++++++++
 tools/perf/util/evlist.c | 25 +++++++++++++++++++++++++
 tools/perf/util/evlist.h |  1 +
 tools/perf/util/record.c |  5 ++++-
 4 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 752709c..ca0689c 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -78,6 +78,22 @@ struct throttle_event {
 /* perf sample has 16 bits size limit */
 #define PERF_SAMPLE_MAX_SIZE (1 << 16)
 
+/*
+ * Events have compatible sample types if the following bits all have the same
+ * value.  This is because the order of sample members is fixed.  For sample
+ * events the order is: PERF_SAMPLE_IP, PERF_SAMPLE_TID, PERF_SAMPLE_TIME,
+ * PERF_SAMPLE_ADDR, PERF_SAMPLE_ID.  For non-sample events the sample members
+ * are accessed in reverse order.  The order is: PERF_SAMPLE_ID,
+ * PERF_SAMPLE_STREAM_ID, PERF_SAMPLE_CPU.  PERF_SAMPLE_IDENTIFIER is added for
+ * completeness but it should not be used with PERF_SAMPLE_ID.  Sample types
+ * that include PERF_SAMPLE_IDENTIFIER are always compatible.
+ */
+#define PERF_COMPAT_MASK				\
+	(PERF_SAMPLE_IP   | PERF_SAMPLE_TID       |	\
+	 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR      |	\
+	 PERF_SAMPLE_ID   | PERF_SAMPLE_STREAM_ID |	\
+	 PERF_SAMPLE_CPU  | PERF_SAMPLE_IDENTIFIER)
+
 struct sample_event {
 	struct perf_event_header        header;
 	u64 array[];
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index ffcccdd..04c3fc8 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -87,6 +87,31 @@ static void perf_evlist__update_id_pos(struct perf_evlist *evlist)
 	perf_evlist__set_id_pos(evlist);
 }
 
+/**
+ * perf_evlist__make_sample_types_compatible - make sample types compatible.
+ * @evlist: selected event list
+ *
+ * Events with compatible sample types all have the same id_pos and is_pos.
+ * This can be achieved by matching the bits of PERF_COMPAT_MASK.
+ */
+void perf_evlist__make_sample_types_compatible(struct perf_evlist *evlist)
+{
+	struct perf_evsel *evsel;
+	u64 compat = 0;
+
+	list_for_each_entry(evsel, &evlist->entries, node)
+		compat |= evsel->attr.sample_type & PERF_COMPAT_MASK;
+
+	list_for_each_entry(evsel, &evlist->entries, node) {
+		evsel->attr.sample_type |= compat;
+		evsel->sample_size =
+			__perf_evsel__sample_size(evsel->attr.sample_type);
+		perf_evsel__calc_id_pos(evsel);
+	}
+
+	perf_evlist__set_id_pos(evlist);
+}
+
 static void perf_evlist__purge(struct perf_evlist *evlist)
 {
 	struct perf_evsel *pos, *n;
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 7f8f1ae..8c5cdb9 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -94,6 +94,7 @@ int perf_evlist__open(struct perf_evlist *evlist);
 void perf_evlist__close(struct perf_evlist *evlist);
 
 void perf_evlist__set_id_pos(struct perf_evlist *evlist);
+void perf_evlist__make_sample_types_compatible(struct perf_evlist *evlist);
 bool perf_can_sample_identifier(void);
 void perf_evlist__config(struct perf_evlist *evlist,
 			 struct perf_record_opts *opts);
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c
index 18d73aa..6e01bf2 100644
--- a/tools/perf/util/record.c
+++ b/tools/perf/util/record.c
@@ -104,5 +104,8 @@ void perf_evlist__config(struct perf_evlist *evlist,
 			perf_evsel__set_sample_id(evsel, use_sample_identifier);
 	}
 
-	perf_evlist__set_id_pos(evlist);
+	if (use_sample_identifier)
+		perf_evlist__set_id_pos(evlist);
+	else
+		perf_evlist__make_sample_types_compatible(evlist);
 }
-- 
1.7.11.7


  parent reply	other threads:[~2013-10-18 12:31 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-18 12:28 [PATCH 00/19] perf tools: fixes and tweaks Adrian Hunter
2013-10-18 12:28 ` [PATCH 01/19] perf evsel: Add missing 'mmap2' from debug print Adrian Hunter
2013-10-23  7:53   ` [tip:perf/core] " tip-bot for Adrian Hunter
2013-10-18 12:28 ` [PATCH 02/19] perf evsel: Add a debug print if perf_event_open fails Adrian Hunter
2013-10-18 12:29 ` [PATCH 03/19] perf record: Improve write_output error message Adrian Hunter
2013-10-20 20:43   ` Jiri Olsa
2013-10-21  6:07     ` Adrian Hunter
2013-10-21  8:48       ` Jiri Olsa
2013-10-23  7:53   ` [tip:perf/core] " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 04/19] perf evsel: Add missing decrement in id sample parsing Adrian Hunter
2013-10-20 20:44   ` Jiri Olsa
2013-10-23  7:53   ` [tip:perf/core] " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 05/19] perf session: Add missing sample flush for piped events Adrian Hunter
2013-10-20 20:45   ` Jiri Olsa
2013-10-23  7:53   ` [tip:perf/core] " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 06/19] perf session: Add missing members to perf_event__attr_swap() Adrian Hunter
2013-10-20 20:47   ` Jiri Olsa
2013-10-23  7:53   ` [tip:perf/core] " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 07/19] perf script: Set up output options for in-stream attributes Adrian Hunter
2013-10-18 13:30   ` David Ahern
2013-10-18 14:32     ` Arnaldo Carvalho de Melo
2013-10-22  7:35       ` Adrian Hunter
2013-10-18 12:29 ` [PATCH 08/19] perf inject: Do not repipe attributes to a perf.data file Adrian Hunter
2013-10-18 12:29 ` [PATCH 09/19] perf tools: Fix 32-bit cross build Adrian Hunter
2013-10-20 20:42   ` Jiri Olsa
2013-10-21  5:53     ` Adrian Hunter
2013-10-21  8:46       ` Jiri Olsa
2013-10-21  9:02         ` Adrian Hunter
2013-10-21 14:12   ` Arnaldo Carvalho de Melo
2013-10-21 18:29     ` Adrian Hunter
2013-10-18 12:29 ` [PATCH 10/19] perf evlist: Fix 32-bit build error Adrian Hunter
2013-10-23  7:53   ` [tip:perf/core] " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 11/19] perf tools: Fix test_on_exit for 32-bit build Adrian Hunter
2013-10-23  7:53   ` [tip:perf/core] " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 12/19] perf tools: Fix bench/numa.c " Adrian Hunter
2013-10-23  7:54   ` [tip:perf/core] " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 13/19] perf tools: Fix libunwind build and feature detection " Adrian Hunter
2013-10-20 20:43   ` Jiri Olsa
2013-10-21 14:14     ` Arnaldo Carvalho de Melo
2013-10-22  7:40       ` Adrian Hunter
2013-10-18 12:29 ` [PATCH 14/19] perf evlist: Add a debug print if event buffer mmap fails Adrian Hunter
2013-10-20 20:43   ` Jiri Olsa
2013-10-18 12:29 ` [PATCH 15/19] perf tools: fix perf_evlist__mmap comments Adrian Hunter
2013-10-23  7:54   ` [tip:perf/core] perf evlist: Fix " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 16/19] perf tools: factor out duplicated evlist mmap code Adrian Hunter
2013-10-23  7:54   ` [tip:perf/core] perf evlist: Factor out duplicated " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 17/19] perf script: print addr by default for BTS Adrian Hunter
2013-10-18 18:20   ` David Ahern
2013-10-23  7:54   ` [tip:perf/core] perf script: Print " tip-bot for Adrian Hunter
2013-10-18 12:29 ` [PATCH 18/19] perf record: add an option to force per-cpu mmaps Adrian Hunter
2013-10-18 12:29 ` Adrian Hunter [this message]
2013-10-18 14:25   ` [PATCH 19/19] perf tools: allow non-matching sample types David Ahern
2013-10-18 14:50     ` Adrian Hunter
2013-10-18 15:03       ` David Ahern

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=1382099356-4918-20-git-send-email-adrian.hunter@intel.com \
    --to=adrian.hunter@intel.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@ghostprotocols.net \
    --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@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).