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



Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐