[PATCH 2/2] ARM: perf: add required isbs() to ARMv7 backend

Jean Pihet jean.pihet at newoldbits.com
Wed Mar 16 12:00:14 EDT 2011


On Wed, Mar 16, 2011 at 4:38 PM, Will Deacon <will.deacon at arm.com> wrote:
> The ARMv7 architecture does not guarantee that effects from co-processor
> writes are immediately visible to following instructions.
>
> This patch adds two isbs to the ARMv7 perf code:
>
> (1) Immediately after selecting an event register, so that the PMU state
>    following this instruction is consistent with the new event.
Ok

>
> (2) Immediately before writing to the PMCR, so that any previous writes
>    to the PMU have taken effect before (typically) enabling the
>    counters.
Should the isb come _after_ the cp15 instruction so that the current
access is actually performed?

Thanks,
Jean

>
> Cc: Jean Pihet <jean.pihet at newoldbits.com>
> Signed-off-by: Will Deacon <will.deacon at arm.com>
> ---
>  arch/arm/kernel/perf_event_v7.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c
> index 3f42473..a79a7b6 100644
> --- a/arch/arm/kernel/perf_event_v7.c
> +++ b/arch/arm/kernel/perf_event_v7.c
> @@ -466,6 +466,7 @@ static inline unsigned long armv7_pmnc_read(void)
>  static inline void armv7_pmnc_write(unsigned long val)
>  {
>        val &= ARMV7_PMNC_MASK;
> +       isb();
>        asm volatile("mcr p15, 0, %0, c9, c12, 0" : : "r"(val));
>  }
>
> @@ -502,6 +503,7 @@ static inline int armv7_pmnc_select_counter(unsigned int idx)
>
>        val = (idx - ARMV7_EVENT_CNT_TO_CNTx) & ARMV7_SELECT_MASK;
>        asm volatile("mcr p15, 0, %0, c9, c12, 5" : : "r" (val));
> +       isb();
>
>        return idx;
>  }
> --
> 1.7.0.4
>
>



More information about the linux-arm-kernel mailing list