解决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。



猜你喜欢

转载自blog.csdn.net/dean_gdp/article/details/70245116