All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <andi@firstfloor.org>,
	jolsa@kernel.org, linux-kernel@vger.kernel.org,
	Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH 1/3] perf pt: Mark PT return events as "return"
Date: Tue, 24 May 2016 15:10:52 -0300	[thread overview]
Message-ID: <20160524181052.GW8897@kernel.org> (raw)
In-Reply-To: <574480AB.2000701@intel.com>

Em Tue, May 24, 2016 at 07:26:19PM +0300, Adrian Hunter escreveu:
> On 24/05/2016 5:57 p.m., Arnaldo Carvalho de Melo wrote:
> > Em Mon, May 23, 2016 at 05:52:23PM -0700, Andi Kleen escreveu:
> > > From: Andi Kleen <ak@linux.intel.com>
> > > 
> > > With perf script --itrace=cr we can synthesize calls and returns out of
> > > a PT log. However both calls and returns are marked with the same event,
> > > called branches. This makes it difficult to read and post process,
> > > because calls and returns are somewhat diffferent.
> > > 
> > > Create a separate return event and mark the returns as return.
> > 
> > Adrian, you voiced some concerns about this patch, are those settled?
> 
> What about beautifying the sample flags i.e. instead of displaying the
> letters interpret them into something more human readable e.g.

Looks like a good idea, but can't this be done on top of what he sent?

- Arnaldo
 
> bc	call
> br	return
> bo	conditional jump
> b	jump
> bci	software interrupt
> bri	return from interrupt
> bcs	system call
> brs	return from system call
> by	asynchronous branch
> bcyi	hardware interrupt
> bA	transaction abort
> bB	trace begin
> bE	trace end
> 
> In Tx (x) can turn up on a number of those too.
> 
> 
> > Can I have your Acked-by, please?
> > 
> > - Arnaldo
> > 
> > > Cc: adrian.hunter@intel.com
> > > Signed-off-by: Andi Kleen <ak@linux.intel.com>
> > > ---
> > >   tools/perf/util/intel-pt.c | 53 +++++++++++++++++++++++++++++++++++++++++-----
> > >   1 file changed, 48 insertions(+), 5 deletions(-)
> > > 
> > > diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
> > > index 137196990012..4f0b1d7adf50 100644
> > > --- a/tools/perf/util/intel-pt.c
> > > +++ b/tools/perf/util/intel-pt.c
> > > @@ -82,9 +82,12 @@ struct intel_pt {
> > >   	u64 instructions_id;
> > > 
> > >   	bool sample_branches;
> > > +	bool sample_returns;
> > >   	u32 branches_filter;
> > >   	u64 branches_sample_type;
> > > +	u64 returns_sample_type;
> > >   	u64 branches_id;
> > > +	u64 returns_id;
> > > 
> > >   	bool sample_transactions;
> > >   	u64 transactions_sample_type;
> > > @@ -960,7 +963,8 @@ static int intel_pt_inject_event(union perf_event *event,
> > >   	return perf_event__synthesize_sample(event, type, 0, sample, swapped);
> > >   }
> > > 
> > > -static int intel_pt_synth_branch_sample(struct intel_pt_queue *ptq)
> > > +static int intel_pt_synth_branch_sample(struct intel_pt_queue *ptq,
> > > +					bool is_return)
> > >   {
> > >   	int ret;
> > >   	struct intel_pt *pt = ptq->pt;
> > > @@ -990,8 +994,13 @@ static int intel_pt_synth_branch_sample(struct intel_pt_queue *ptq)
> > >   	sample.pid = ptq->pid;
> > >   	sample.tid = ptq->tid;
> > >   	sample.addr = ptq->state->to_ip;
> > > -	sample.id = ptq->pt->branches_id;
> > > -	sample.stream_id = ptq->pt->branches_id;
> > > +	if (is_return) {
> > > +		sample.id = ptq->pt->returns_id;
> > > +		sample.stream_id = ptq->pt->returns_id;
> > > +	} else {
> > > +		sample.id = ptq->pt->branches_id;
> > > +		sample.stream_id = ptq->pt->branches_id;
> > > +	}
> > >   	sample.period = 1;
> > >   	sample.cpu = ptq->cpu;
> > >   	sample.flags = ptq->flags;
> > > @@ -1014,6 +1023,8 @@ static int intel_pt_synth_branch_sample(struct intel_pt_queue *ptq)
> > > 
> > >   	if (pt->synth_opts.inject) {
> > >   		ret = intel_pt_inject_event(event, &sample,
> > > +					    is_return ?
> > > +					    pt->returns_sample_type :
> > >   					    pt->branches_sample_type,
> > >   					    pt->synth_needs_swap);
> > >   		if (ret)
> > > @@ -1241,7 +1252,13 @@ static int intel_pt_sample(struct intel_pt_queue *ptq)
> > >   		thread_stack__set_trace_nr(ptq->thread, state->trace_nr);
> > > 
> > >   	if (pt->sample_branches) {
> > > -		err = intel_pt_synth_branch_sample(ptq);
> > > +		err = intel_pt_synth_branch_sample(ptq, false);
> > > +		if (err)
> > > +			return err;
> > > +	}
> > > +
> > > +	if (pt->sample_returns) {
> > > +		err = intel_pt_synth_branch_sample(ptq, true);
> > >   		if (err)
> > >   			return err;
> > >   	}
> > > @@ -1956,7 +1973,33 @@ static int intel_pt_synth_events(struct intel_pt *pt,
> > >   		}
> > >   		pt->sample_branches = true;
> > >   		pt->branches_sample_type = attr.sample_type;
> > > -		pt->branches_id = id;
> > > +		pt->branches_id = id++;
> > > +	}
> > > +	if (pt->synth_opts.returns) {
> > > +		attr.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
> > > +		attr.sample_period = 1;
> > > +		attr.sample_type |= PERF_SAMPLE_ADDR;
> > > +		attr.sample_type &= ~(u64)PERF_SAMPLE_CALLCHAIN;
> > > +		attr.sample_type &= ~(u64)PERF_SAMPLE_BRANCH_STACK;
> > > +		pr_debug("Synthesizing 'return' event with id %" PRIu64 " sample type %#" PRIx64 "\n",
> > > +			 id, (u64)attr.sample_type);
> > > +		err = intel_pt_synth_event(session, &attr, id);
> > > +		if (err) {
> > > +			pr_err("%s: failed to synthesize 'return' event type\n",
> > > +			       __func__);
> > > +			return err;
> > > +		}
> > > +		pt->sample_returns = true;
> > > +		pt->returns_sample_type = attr.sample_type;
> > > +		pt->returns_id = id;
> > > +		evlist__for_each(evlist, evsel) {
> > > +			if (evsel->id && evsel->id[0] == pt->returns_id) {
> > > +				if (evsel->name)
> > > +					zfree(&evsel->name);
> > > +				evsel->name = strdup("return");
> > > +				break;
> > > +			}
> > > +		}
> > >   	}
> > > 
> > >   	pt->synth_needs_swap = evsel->needs_swap;
> > > --
> > > 2.5.5

  reply	other threads:[~2016-05-24 18:11 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-24  0:52 [PATCH 1/3] perf pt: Mark PT return events as "return" Andi Kleen
2016-05-24  0:52 ` [PATCH 2/3] perf util: Move get_main_thread to thread.c Andi Kleen
2016-05-24 14:56   ` Arnaldo Carvalho de Melo
2016-06-02  6:30   ` [tip:perf/core] perf thread: Adopt get_main_thread from db-export.c tip-bot for Andi Kleen
2016-05-24  0:52 ` [PATCH 3/3] perf script: Support callindent Andi Kleen
2016-05-24 14:57 ` [PATCH 1/3] perf pt: Mark PT return events as "return" Arnaldo Carvalho de Melo
2016-05-24 16:26   ` Adrian Hunter
2016-05-24 18:10     ` Arnaldo Carvalho de Melo [this message]
2016-05-24 19:05       ` Andi Kleen
2016-05-24 19:23         ` Adrian Hunter
2016-05-24 19:28           ` Andi Kleen

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=20160524181052.GW8897@kernel.org \
    --to=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=andi@firstfloor.org \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.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.