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 <mayna...@us.ibm.com>
> 
> 
> 
> 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
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to