All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Ahern <dsahern@gmail.com>
To: Adrian Hunter <adrian.hunter@intel.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
	linux-kernel@vger.kernel.org,
	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>,
	Peter Zijlstra <peterz@infradead.org>,
	Stephane Eranian <eranian@google.com>
Subject: Re: [PATCH V2 12/15] perf tools: allow non-matching sample types
Date: Thu, 27 Jun 2013 10:39:11 -0600	[thread overview]
Message-ID: <51CC6AAF.4030404@gmail.com> (raw)
In-Reply-To: <1372319707-13892-13-git-send-email-adrian.hunter@intel.com>

On 6/27/13 1:55 AM, Adrian Hunter wrote:
> 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/builtin-report.c |   2 +-
>   tools/perf/util/event.h     |  14 +++++
>   tools/perf/util/evlist.c    | 135 ++++++++++++++++++++++++++++++++++++++++++--
>   tools/perf/util/evlist.h    |   8 ++-
>   tools/perf/util/evsel.c     |  64 ++++++++++++++++++++-
>   tools/perf/util/evsel.h     |  10 ++++
>   tools/perf/util/session.c   |   8 ++-
>   7 files changed, 230 insertions(+), 11 deletions(-)
>
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index ca98d34..58572ac 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -367,7 +367,7 @@ static int process_read_event(struct perf_tool *tool,
>   static int perf_report__setup_sample_type(struct perf_report *rep)
>   {
>   	struct perf_session *self = rep->session;
> -	u64 sample_type = perf_evlist__sample_type(self->evlist);
> +	u64 sample_type = perf_evlist__combined_sample_type(self->evlist);
>
>   	if (!self->fd_pipe && !(sample_type & PERF_SAMPLE_CALLCHAIN)) {
>   		if (sort__has_parent) {
> diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
> index 1813895..3aef78c 100644
> --- a/tools/perf/util/event.h
> +++ b/tools/perf/util/event.h
> @@ -65,6 +65,20 @@ struct read_event {
>   	PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |	\
>   	 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
>
> +/*
> + * 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.
> + */
> +#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)
> +
>   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 a660f56..78331da 100644
> --- a/tools/perf/util/evlist.c
> +++ b/tools/perf/util/evlist.c
> @@ -49,6 +49,45 @@ struct perf_evlist *perf_evlist__new(void)
>   	return evlist;
>   }
>
> +/**
> + * perf_evlist__set_id_pos - set the positions of event ids.
> + * @evlist: selected event list
> + *
> + * Events with compatible sample types all have the same id_pos
> + * and is_pos.  For convenience, put a copy on evlist.
> + */
> +static void perf_evlist__set_id_pos(struct perf_evlist *evlist)
> +{
> +	struct perf_evsel *first = perf_evlist__first(evlist);
> +
> +	evlist->id_pos = first->id_pos;
> +	evlist->is_pos = first->is_pos;
> +}
> +
> +/**
> + * 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);
> +}
> +

While this works for a combined S/W and tracepoint events session, I do 
not like promoting sample types to the minimum compatible level for all 
events in the session. perf needs to allow each event to have its own 
sample_type and not force a minimal compatibility.

David

  reply	other threads:[~2013-06-27 16:39 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-27  7:54 [PATCH V2 00/15] perf tools: some fixes and tweaks Adrian Hunter
2013-06-27  7:54 ` [PATCH V2 01/15] perf tools: remove unused parameter Adrian Hunter
2013-06-27  7:54 ` [PATCH V2 02/15] perf tools: fix missing tool parameter Adrian Hunter
2013-06-27  7:54 ` [PATCH V2 03/15] perf tools: fix missing 'finished_round' Adrian Hunter
2013-06-27  7:54 ` [PATCH V2 04/15] perf tools: fix parse_events_terms() segfault on error path Adrian Hunter
2013-06-27  7:54 ` [PATCH V2 05/15] perf tools: fix new_term() missing free " Adrian Hunter
2013-06-27  7:54 ` [PATCH V2 06/15] perf tools: fix parse_events_terms() freeing local variable " Adrian Hunter
2013-06-27 16:13   ` David Ahern
2013-06-28  6:32     ` Adrian Hunter
2013-06-28 13:41       ` David Ahern
2013-06-28 13:57         ` Jiri Olsa
2013-06-27  7:54 ` [PATCH V2 07/15] perf tools: add const specifier to perf_pmu__find name parameter Adrian Hunter
2013-06-27  7:55 ` [PATCH V2 08/15] perf tools: tidy duplicated munmap code Adrian Hunter
2013-06-27  7:55 ` [PATCH V2 09/15] perf tools: validate perf event header size Adrian Hunter
2013-06-27  7:55 ` [PATCH V2 10/15] perf tools: add debug prints Adrian Hunter
2013-06-27  7:55 ` [PATCH V2 11/15] perf tools: fix symbol_conf.nr_events Adrian Hunter
2013-06-27  7:55 ` [PATCH V2 12/15] perf tools: allow non-matching sample types Adrian Hunter
2013-06-27 16:39   ` David Ahern [this message]
2013-07-01  9:32     ` Adrian Hunter
2013-07-01 18:53       ` David Ahern
2013-07-01 19:10         ` Stephane Eranian
2013-07-02  6:58           ` Adrian Hunter
2013-07-03  6:40             ` Stephane Eranian
2013-07-02  7:09         ` Adrian Hunter
2013-07-03  6:44           ` Stephane Eranian
2013-08-26 18:54             ` Arnaldo Carvalho de Melo
2013-06-27  7:55 ` [PATCH V2 13/15] perf tools: struct thread has a tid not a pid Adrian Hunter
2013-06-27  7:55 ` [PATCH V2 14/15] perf tools: add pid to struct thread Adrian Hunter
2013-06-27 16:52   ` David Ahern
2013-06-27  7:55 ` [PATCH V2 15/15] perf tools: fix ppid in thread__fork() Adrian Hunter
2013-06-27 16:57   ` David Ahern
2013-06-28  6:47     ` Adrian Hunter
2013-06-28 13:46       ` 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=51CC6AAF.4030404@gmail.com \
    --to=dsahern@gmail.com \
    --cc=acme@ghostprotocols.net \
    --cc=adrian.hunter@intel.com \
    --cc=efault@gmx.de \
    --cc=eranian@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=namhyung@gmail.com \
    --cc=paulus@samba.org \
    --cc=peterz@infradead.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 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.