英特尔PEBS示例上下文

时间:2017-12-01 14:20:54

标签: linux-kernel perf intel-pmu

我正在使用Linux perf工具来监控系统范围(exclude_kernel == 0)PEBS样本。我想知道PEBS样本是否可以在中断上下文中发生(即,在中断处理程序正在服务中断期间)。如果可能,有没有办法确定PEBS样本的上下文(例如,进程上下文,中断上下文)(即寄存器位)?

1 个答案:

答案 0 :(得分:0)

正在处理中断时不会发生PEBS采样PEBS Data Store Save Area

PEBS使用上述缓冲机制来存储其记录。您可以清楚地看到所有PEBS相关字段,例如PEBS buffer basePEBS interrupt threshold等。当PEBS buffer index与指定的PEBS interrupt threshold匹配时,会发生 PEBS中断

PEBS中断处理程序会将PEBS Buffer Index重置回PEBS buffer base的开头。如果PEBS采样要继续,那么PEBS也会尝试访问DS缓冲区来增加PEBS Buffer Index。因此,PEBS中断和PEBS本身都会尝试写入相同的DS保存区域。这显然指向PEBS中断处理程序和PEBS模块之间的竞争条件

为了避免这种竞争条件,需要禁用PEBS采样(通过禁用IA32_PEBS_ENABLE msr寄存器中的标志)。此外,中断处理程序也必须禁用所有事件计数器。这是内核中的proof

但是,如果 PEBS中断导致CPU过多限制,您可以进行 PERF_RECORD_THROTTLE 事件,但这当然不是 PEBS_SAMPLE 事件,而不是 PERF_RECORD 事件。