All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maynard Johnson <maynardj@us.ibm.com>
To: Eric B Munson <emunson@mgebm.net>
Cc: robert.richter@amd.com, linux-kernel@vger.kernel.org,
	oprofile-list@lists.sf.net, paulus@samba.org,
	linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH] oprofile, powerpc: Handle events that raise an exception without overflowing
Date: Mon, 23 May 2011 15:04:20 -0500	[thread overview]
Message-ID: <4DDABDC4.1010800@us.ibm.com> (raw)
In-Reply-To: <20110523193736.GA2997@mgebm.net>

Eric B Munson wrote:
> On Mon, 23 May 2011, Eric B Munson wrote:
> 
>> Commit 0837e3242c73566fc1c0196b4ec61779c25ffc93 fixes a situation on POWER7
>> where events can roll back if a specualtive event doesn't actually complete.
>> This can raise a performance monitor exception.  We need to catch this to ensure
>> that we reset the PMC.  In all cases the PMC will be less than 256 cycles from
>> overflow.
>>
>> This patch lifts Anton's fix for the problem in perf and applies it to oprofile
>> as well.
>>
>> Signed-off-by: Eric B Munson <emunson@mgebm.net>
>> Cc: <stable@kernel.org> # as far back as it applies cleanly
> 
> I'd like to get this patch into mainline this merge window if at all possible.
Ack.  I've been able to create a system hang profiling with speculative events on POWER7.  This patch fixes that problem.

-Maynard

> 
>> ---
>>  arch/powerpc/oprofile/op_model_power4.c |   24 +++++++++++++++++++++++-
>>  1 files changed, 23 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/powerpc/oprofile/op_model_power4.c b/arch/powerpc/oprofile/op_model_power4.c
>> index 8ee51a2..e6bec74 100644
>> --- a/arch/powerpc/oprofile/op_model_power4.c
>> +++ b/arch/powerpc/oprofile/op_model_power4.c
>> @@ -261,6 +261,28 @@ static int get_kernel(unsigned long pc, unsigned long mmcra)
>>  	return is_kernel;
>>  }
>>  
>> +static bool pmc_overflow(unsigned long val)
>> +{
>> +	if ((int)val < 0)
>> +		return true;
>> +
>> +	/*
>> +	 * Events on POWER7 can roll back if a speculative event doesn't
>> +	 * eventually complete. Unfortunately in some rare cases they will
>> +	 * raise a performance monitor exception. We need to catch this to
>> +	 * ensure we reset the PMC. In all cases the PMC will be 256 or less
>> +	 * cycles from overflow.
>> +	 *
>> +	 * We only do this if the first pass fails to find any overflowing
>> +	 * PMCs because a user might set a period of less than 256 and we
>> +	 * don't want to mistakenly reset them.
>> +	 */
>> +	if (__is_processor(PV_POWER7) && ((0x80000000 - val) <= 256))
>> +		return true;
>> +
>> +	return false;
>> +}
>> +
>>  static void power4_handle_interrupt(struct pt_regs *regs,
>>  				    struct op_counter_config *ctr)
>>  {
>> @@ -281,7 +303,7 @@ static void power4_handle_interrupt(struct pt_regs *regs,
>>  
>>  	for (i = 0; i < cur_cpu_spec->num_pmcs; ++i) {
>>  		val = classic_ctr_read(i);
>> -		if (val < 0) {
>> +		if (pmc_overflow(val)) {
>>  			if (oprofile_running && ctr[i].enabled) {
>>  				oprofile_add_ext_sample(pc, regs, i, is_kernel);
>>  				classic_ctr_write(i, reset_value[i]);
>> -- 
>> 1.7.4.1
>>
>>
>>
>> _______________________________________________
>> Linuxppc-dev mailing list
>> Linuxppc-dev@lists.ozlabs.org
>> https://lists.ozlabs.org/listinfo/linuxppc-dev

WARNING: multiple messages have this Message-ID (diff)
From: Maynard Johnson <maynardj@us.ibm.com>
To: Eric B Munson <emunson@mgebm.net>
Cc: benh@kernel.crashing.org, robert.richter@amd.com,
	oprofile-list@lists.sf.net, paulus@samba.org,
	linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] oprofile, powerpc: Handle events that raise an exception without overflowing
Date: Mon, 23 May 2011 15:04:20 -0500	[thread overview]
Message-ID: <4DDABDC4.1010800@us.ibm.com> (raw)
In-Reply-To: <20110523193736.GA2997@mgebm.net>

Eric B Munson wrote:
> On Mon, 23 May 2011, Eric B Munson wrote:
> 
>> Commit 0837e3242c73566fc1c0196b4ec61779c25ffc93 fixes a situation on POWER7
>> where events can roll back if a specualtive event doesn't actually complete.
>> This can raise a performance monitor exception.  We need to catch this to ensure
>> that we reset the PMC.  In all cases the PMC will be less than 256 cycles from
>> overflow.
>>
>> This patch lifts Anton's fix for the problem in perf and applies it to oprofile
>> as well.
>>
>> Signed-off-by: Eric B Munson <emunson@mgebm.net>
>> Cc: <stable@kernel.org> # as far back as it applies cleanly
> 
> I'd like to get this patch into mainline this merge window if at all possible.
Ack.  I've been able to create a system hang profiling with speculative events on POWER7.  This patch fixes that problem.

-Maynard

> 
>> ---
>>  arch/powerpc/oprofile/op_model_power4.c |   24 +++++++++++++++++++++++-
>>  1 files changed, 23 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/powerpc/oprofile/op_model_power4.c b/arch/powerpc/oprofile/op_model_power4.c
>> index 8ee51a2..e6bec74 100644
>> --- a/arch/powerpc/oprofile/op_model_power4.c
>> +++ b/arch/powerpc/oprofile/op_model_power4.c
>> @@ -261,6 +261,28 @@ static int get_kernel(unsigned long pc, unsigned long mmcra)
>>  	return is_kernel;
>>  }
>>  
>> +static bool pmc_overflow(unsigned long val)
>> +{
>> +	if ((int)val < 0)
>> +		return true;
>> +
>> +	/*
>> +	 * Events on POWER7 can roll back if a speculative event doesn't
>> +	 * eventually complete. Unfortunately in some rare cases they will
>> +	 * raise a performance monitor exception. We need to catch this to
>> +	 * ensure we reset the PMC. In all cases the PMC will be 256 or less
>> +	 * cycles from overflow.
>> +	 *
>> +	 * We only do this if the first pass fails to find any overflowing
>> +	 * PMCs because a user might set a period of less than 256 and we
>> +	 * don't want to mistakenly reset them.
>> +	 */
>> +	if (__is_processor(PV_POWER7) && ((0x80000000 - val) <= 256))
>> +		return true;
>> +
>> +	return false;
>> +}
>> +
>>  static void power4_handle_interrupt(struct pt_regs *regs,
>>  				    struct op_counter_config *ctr)
>>  {
>> @@ -281,7 +303,7 @@ static void power4_handle_interrupt(struct pt_regs *regs,
>>  
>>  	for (i = 0; i < cur_cpu_spec->num_pmcs; ++i) {
>>  		val = classic_ctr_read(i);
>> -		if (val < 0) {
>> +		if (pmc_overflow(val)) {
>>  			if (oprofile_running && ctr[i].enabled) {
>>  				oprofile_add_ext_sample(pc, regs, i, is_kernel);
>>  				classic_ctr_write(i, reset_value[i]);
>> -- 
>> 1.7.4.1
>>
>>
>>
>> _______________________________________________
>> Linuxppc-dev mailing list
>> Linuxppc-dev@lists.ozlabs.org
>> https://lists.ozlabs.org/listinfo/linuxppc-dev


  reply	other threads:[~2011-05-23 20:05 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-23 14:22 [PATCH] oprofile, powerpc: Handle events that raise an exception without overflowing Eric B Munson
2011-05-23 14:22 ` Eric B Munson
2011-05-23 19:37 ` Eric B Munson
2011-05-23 19:37   ` Eric B Munson
2011-05-23 20:04   ` Maynard Johnson [this message]
2011-05-23 20:04     ` Maynard Johnson
2011-05-24  9:27 ` Robert Richter
2011-05-24  9:27   ` Robert Richter

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=4DDABDC4.1010800@us.ibm.com \
    --to=maynardj@us.ibm.com \
    --cc=emunson@mgebm.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=oprofile-list@lists.sf.net \
    --cc=paulus@samba.org \
    --cc=robert.richter@amd.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 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.