解决perf在imx6q上读写PMU event counter都是零
最近在用perf分析性能,在imx6q上验证PMU event采样,发现cache-misses等硬件事件计数都是0,瞬间崩溃。傻乎乎分析啦perf代码,感觉应该不是perf代码原因,到freescale官网上找到一片类似的问题:https://community.nxp.com/thread/302685http://stackoverflow.com/questions/22567
最近在用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。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)