devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Nick Hu <nickhu@andestech.com>
To: Mark Rutland <mark.rutland@arm.com>
Cc: "Greentime Ying-Han Hu(胡英漢)" <greentime@andestech.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"deanbo422@gmail.com" <deanbo422@gmail.com>,
	"peterz@infradead.org" <peterz@infradead.org>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"acme@kernel.org" <acme@kernel.org>,
	"alexander.shishkin@linux.intel.com"
	<alexander.shishkin@linux.intel.com>,
	"jolsa@redhat.com" <jolsa@redhat.com>,
	"namhyung@kernel.org" <namhyung@kernel.org>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"sboyd@codeaurora.org" <sboyd@codeaurora.org>,
	"geert@linux-m68k.org" <geert@linux-m68k.org>,
	"Zong Zong-Xian Li(李宗憲)" <zong@andestech.com>,
	"ebiederm@xmission.com" <ebiederm@xmission.com>
Subject: Re: [PATCH 4/5] nds32: Fix perf multiple events map to same counter.
Date: Mon, 22 Oct 2018 18:20:27 +0800	[thread overview]
Message-ID: <20181022102027.GC24110@andestech.com> (raw)
In-Reply-To: <20181018142905.bn73t7rvtdjr2tbf@lakrids.cambridge.arm.com>

Hi Mark,

On Thu, Oct 18, 2018 at 10:29:05PM +0800, Mark Rutland wrote:
> On Thu, Oct 18, 2018 at 04:43:16PM +0800, Nickhu wrote:
> > When there are multiple events map to the same counter, the counter
> > counts inaccurately. This is because each counter only counts one event
> > in the same time.
> > So when there are multiple events map to same counter, they have to take
> > turns in each context.
> > 
> > There are two solution:
> > 1. Print the error message when multiple events map to the same counter.
> > But print the error message would let the program hang in loop. The ltp
> > (linux test program) would be failed when the program hang in loop.
> > 
> > 2. Don't print the error message, the ltp would pass. But the user need to
> > have the knowledge that don't count the events which map to the same
> > counter, or the user will get the inaccurate results.
> > 
> > We choose method 2 for the solution
> 
> This is the correct solution. Perf exposes the active/enabled time in
> the perf event, so the user can determine that the event wasn't enabled
> all of the time.
> 
> This should be folded into the commit adding perf support.
> 
> Thanks,
> Mark.
> 
> > 
> > Signed-off-by: Nickhu <nickhu@andestech.com>
> > ---
> >  arch/nds32/include/asm/pmu.h       |  1 +
> >  arch/nds32/kernel/perf_event_cpu.c | 30 ++++++++++++++++++++----------
> >  2 files changed, 21 insertions(+), 10 deletions(-)
> > 
> > diff --git a/arch/nds32/include/asm/pmu.h b/arch/nds32/include/asm/pmu.h
> > index 3fbbe97c2d42..e75ec34af5f6 100644
> > --- a/arch/nds32/include/asm/pmu.h
> > +++ b/arch/nds32/include/asm/pmu.h
> > @@ -55,6 +55,7 @@ enum { PFMC0, PFMC1, PFMC2, MAX_COUNTERS };
> >   */
> >  #define NDS32_IDX_CYCLE_COUNTER			0
> >  #define NDS32_IDX_COUNTER0			1
> > +#define NDS32_IDX_COUNTER1			2
> >  #define NDS32_IDX_COUNTER_LAST(cpu_pmu) \
> >  	(NDS32_IDX_CYCLE_COUNTER + (cpu_pmu)->num_events - 1)
> >  
> > diff --git a/arch/nds32/kernel/perf_event_cpu.c b/arch/nds32/kernel/perf_event_cpu.c
> > index 7bb4ebb87b5c..e9a0d8bb2bc1 100644
> > --- a/arch/nds32/kernel/perf_event_cpu.c
> > +++ b/arch/nds32/kernel/perf_event_cpu.c
> > @@ -566,16 +566,26 @@ static int nds32_pmu_get_event_idx(struct pmu_hw_events *cpuc,
> >  	/*
> >  	 * Try to get the counter for correpsonding event
> >  	 */
> > -	if (!test_and_set_bit(idx, cpuc->used_mask))
> > -		return idx;
> > -
> > -	/*
> > -	 * The counter is in use.
> > -	 * The system will hang in the loop.
> > -	 */
> > -	pr_err
> > -	("Multiple events map to one counter, the behavior is undefined.\n");
> > -	return -EPERM;
> > +	if (evtype == SPAV3_0_SEL_TOTAL_CYCLES) {
> > +		if (!test_and_set_bit(idx, cpuc->used_mask))
> > +			return idx;
> > +		if (!test_and_set_bit(NDS32_IDX_COUNTER0, cpuc->used_mask))
> > +			return NDS32_IDX_COUNTER0;
> > +		if (!test_and_set_bit(NDS32_IDX_COUNTER1, cpuc->used_mask))
> > +			return NDS32_IDX_COUNTER1;
> > +	} else if (evtype == SPAV3_1_SEL_COMPLETED_INSTRUCTION) {
> > +		if (!test_and_set_bit(idx, cpuc->used_mask))
> > +			return idx;
> > +		else if (!test_and_set_bit(NDS32_IDX_COUNTER1, cpuc->used_mask))
> > +			return NDS32_IDX_COUNTER1;
> > +		else if (!test_and_set_bit
> > +			 (NDS32_IDX_CYCLE_COUNTER, cpuc->used_mask))
> > +			return NDS32_IDX_CYCLE_COUNTER;
> > +	} else {
> > +		if (!test_and_set_bit(idx, cpuc->used_mask))
> > +			return idx;
> > +	}
> > +	return -EAGAIN;
> >  }
> >  
> >  static void nds32_pmu_start(struct nds32_pmu *cpu_pmu)
> > -- 
> > 2.17.0
> > 
Thanks for the comment.
I will folded it into the commit adding perf support.

  reply	other threads:[~2018-10-22 10:20 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-18  8:43 [PATCH 0/5] nds32: Perf support Nickhu
2018-10-18  8:43 ` [PATCH 1/5] nds32: Perf porting Nickhu
2018-10-18 14:23   ` Mark Rutland
2018-10-22 10:18     ` Nick Hu
2018-10-22 13:15       ` Mark Rutland
2018-10-18  8:43 ` [PATCH 2/5] nds32: Fix bug in bitfield.h Nickhu
2018-10-18 14:26   ` Mark Rutland
2018-10-22 10:19     ` Nick Hu
2018-10-18  8:43 ` [PATCH 3/5] nds32: Add perf call-graph support Nickhu
2018-10-18  8:43 ` [PATCH 4/5] nds32: Fix perf multiple events map to same counter Nickhu
2018-10-18 14:29   ` Mark Rutland
2018-10-22 10:20     ` Nick Hu [this message]
2018-10-18  8:43 ` [PATCH 5/5] nds32: Add document for NDS32 PMU Nickhu
2018-10-18 14:31   ` Mark Rutland
2018-10-22 10:23     ` Nick Hu
2018-10-22 13:17       ` Mark Rutland

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=20181022102027.GC24110@andestech.com \
    --to=nickhu@andestech.com \
    --cc=acme@kernel.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=arnd@arndb.de \
    --cc=deanbo422@gmail.com \
    --cc=ebiederm@xmission.com \
    --cc=geert@linux-m68k.org \
    --cc=greentime@andestech.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=robh+dt@kernel.org \
    --cc=sboyd@codeaurora.org \
    --cc=zong@andestech.com \
    /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).