[patch] perf: ARMv7 wrong "branches" generalized instruction

From: Vince Weaver
Date: Wed Aug 10 2011 - 13:41:18 EST


Hello

Sam Wang reported to me that my perf_event validation tests were failing
with branches on ARM Cortex A9.

It turns out the branches event used (ARMV7_PERFCTR_PC_WRITE) only seems
to count taken branches.

ARMV7_PERFCTR_PC_IMM_BRANCH seems to do a better job of counting both
taken and not-taken. So I've attached a patch to change the definition
for Cotex A9.

This might be needed for Cortex A8 but I don't have a machine to test on
(yet).

I'm assuming this is a proper fix. The "generalized" events aren't
defined very well so there's always some wiggle room about what they mean.

Patch tested on a Pandaboard.

The test code looks like this. There should be 500,000*3 branches. But
the second branch (the not taken "bge test_jmp2") is not counted with
PC_WRITE.

asm( "\teor r3,r3,r3\n"
"\tldr r3,=500000\n"
"test_loop:\n"
"\tB test_jmp\n"
"\tnop\n"
"test_jmp:\n"
"\teor r2,r2,r2\n"
"\tcmp r2,#1\n"
"\tbge test_jmp2\n"
"\tnop\n"
"\tadd r2,r2,#1\n"
"test_jmp2:\n"
"\tsub r3,r3,#1\n"
"\tcmp r3,#1\n"
"\tbgt test_loop\n"
: /* no output registers */
: /* no inputs */
: "cc", "r2", "r3" /* clobbered */
);


Vince
vweaver1@xxxxxxxxxxxx

Signed-off-by: Vince Weaver <vweaver1@xxxxxxxxxxxx>

diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c
index 4c85183..4d11bd5 100644
--- a/arch/arm/kernel/perf_event_v7.c
+++ b/arch/arm/kernel/perf_event_v7.c
@@ -323,7 +323,7 @@ static const unsigned armv7_a9_perf_map[PERF_COUNT_HW_MAX] = {
ARMV7_PERFCTR_INST_OUT_OF_RENAME_STAGE,
[PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_COHERENT_LINE_HIT,
[PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_COHERENT_LINE_MISS,
- [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE,
+ [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_IMM_BRANCH,
[PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
[PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES,
};

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/