Subject: Re: [PATCH] Fix oprofile sampling of marked events on POWER7

From: Benjamin Herrenschmidt <[email-masked]>
Date: Tue, 16 Jun 2009 14:12:14 +1000

On Mon, 2009-06-15 at 08:40 -0500, Maynard Johnson wrote:
> Looks like this posting got overlooked, so I'm re-posting the original patch.  Ben, can you please review?  BTW, Anton reported the problem that this patch fixes.

It was merged upstream after 2.6.30 -rc6, see commit e5fc948b...

Cheers,
Ben.

> Thanks.
> -Maynard
> 
> ==============================================================
> 
> 
> Description
> -----------
> Change ppc64 oprofile kernel driver to use the SLOT bits (MMCRA[37:39]only on 
> older processors where those bits are defined.
> 
> Background
> ----------
> The performance monitor unit of the 64-bit POWER processor family has the 
> ability to collect accurate instruction-level samples when profiling on marked 
> events (i.e., "PM_MRK_<event-name>").  In processors prior to POWER6, the MMCRA 
> register contained "slot information" that the oprofile kernel driver used to 
> adjust the value latched in the SIAR at the time of a PMU interrupt.  But as of 
> POWER6, these slot bits in MMCRA are no longer necessary for oprofile to use, 
> since the SIAR itself holds the accurate sampled instruction address.  With 
> POWER6, these MMCRA slot bits were zero'ed out by hardware so oprofile's use of 
> these slot bits was, in effect, a NOP.  But with POWER7, these bits are no 
> longer zero'ed out; however, they serve some other purpose rather than slot 
> information.  Thus, using these bits on POWER7 to adjust the SIAR value results 
> in samples being attributed to the wrong instructions.  The attached patch 
> changes the oprofile kernel driver to ignore these slot bits on all newer 
> processors starting with POWER6.
> 
> Thanks.
> -Maynard
> 
> Signed-off-by: Maynard Johnson <[email-masked]>
> 
> 
> 
> diff -paur linux/arch/powerpc/oprofile/op_model_power4.c linux-p7-oprofile-patch//arch/powerpc/oprofile/op_model_power4.c
> --- linux/arch/powerpc/oprofile/op_model_power4.c	2009-05-01 08:20:21.000000000 -0500
> +++ linux-p7-oprofile-patch//arch/powerpc/oprofile/op_model_power4.c	2009-05-01 08:20:05.000000000 -0500
> @@ -26,6 +26,7 @@
>  static unsigned long reset_value[OP_MAX_COUNTER];
> 
>  static int oprofile_running;
> +static int use_slot_nums;
> 
>  /* mmcr values are set in power4_reg_setup, used in power4_cpu_setup */
>  static u32 mmcr0_val;
> @@ -61,6 +62,12 @@ static int power4_reg_setup(struct op_co
>  	else
>  		mmcr0_val |= MMCR0_PROBLEM_DISABLE;
> 
> +	if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p) ||
> +	    __is_processor(PV_970) || __is_processor(PV_970FX) ||
> +	    __is_processor(PV_970MP) || __is_processor(PV_970GX) ||
> +	    __is_processor(PV_POWER5) || __is_processor(PV_POWER5p))
> +		use_slot_nums = 1;
> +
>  	return 0;
>  }
> 
> @@ -206,7 +213,7 @@ static unsigned long get_pc(struct pt_re
> 
>  	mmcra = mfspr(SPRN_MMCRA);
> 
> -	if (mmcra & MMCRA_SAMPLE_ENABLE) {
> +	if (use_slot_nums && (mmcra & MMCRA_SAMPLE_ENABLE)) {
>  		slot = ((mmcra & MMCRA_SLOT) >> MMCRA_SLOT_SHIFT);
>  		if (slot > 1)
>  			pc += 4 * (slot - 1);
> 
> 
> _______________________________________________
> Linuxppc-dev mailing list
> [email-masked]
> https://lists.ozlabs.org/listinfo/linuxppc-dev