解決perf在imx6q上讀寫PMU event counter都是零
阿新 • • 發佈:2019-01-05
最近在用perf分析效能,在imx6q上驗證PMU event取樣,發現cache-misses等硬體事件計數都是0,瞬間崩潰。
傻乎乎分析啦perf程式碼,感覺應該不是perf程式碼原因,到freescale官網上找到一片類似的問題:
https://community.nxp.com/thread/302685
http://stackoverflow.com/questions/22567859/getting-zeros-on-cortex-a9-pmu-counters
原來還有cotex-a9的PMU使用還是需要Secure Debug Enable Register的配合,這麼嚴重的bug。
在核心檔案 arch/arm/kernel/perf_event.c初始化cotex-a9 PMU的函式armpmu_reserve_hardware前增加:
static void armv7_pmu_fix(void)
{
u32 val = 0b11;
asm volatile("mcr p15, 0, %0, c1, c1, 1" : : "r" (val));
}
static int
armpmu_reserve_hardware(void)
{
struct arm_pmu_platdata *plat;
int i, err = -ENODEV, irq;
pmu_device = reserve_pmu(ARM_PMU_DEVICE_CPU);
if (IS_ERR(pmu_device)) {
pr_warning("unable to reserve pmu\n");
return PTR_ERR(pmu_device);
}
+ armv7_pmu_fix();
}
總算解決問題啦。
最近又發現了一個現象,上述的方法只有CPU0上的PMU Counter才會正常。其他核上的讀出來都是0。