1. 程式人生 > >解決perf在imx6q上讀寫PMU event counter都是零

解決perf在imx6q上讀寫PMU event counter都是零

最近在用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;

irq_handler_t handle_irq;
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。