Linux kernel 英特尔PEBS示例上下文

Linux kernel 英特尔PEBS示例上下文,linux-kernel,perf,intel-pmu,Linux Kernel,Perf,Intel Pmu,我正在使用LinuxPerf工具监视系统范围(exclude_kernel==0)的PEBS样本。我想知道PEBS示例是否可以发生在中断上下文中(即,在中断处理程序提供中断的过程中)。如果可能,是否有任何方法确定PEBS样本(即寄存器位)的上下文(例如,过程上下文、中断上下文) 中断服务时,PEBS采样从不发生。 PEBS使用上述缓冲机制来存储其记录。您可以清楚地看到所有与PEBS相关的字段,如PEBS buffer base和PEBS interrupt threshold等。当PEBS b

我正在使用LinuxPerf工具监视系统范围(exclude_kernel==0)的PEBS样本。我想知道PEBS示例是否可以发生在中断上下文中(即,在中断处理程序提供中断的过程中)。如果可能,是否有任何方法确定PEBS样本(即寄存器位)的上下文(例如,过程上下文、中断上下文)

中断服务时,PEBS采样从不发生。

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

PEBS中断处理程序将把
PEBS缓冲区索引
重置回
PEBS缓冲区基础
的起始位置。如果要继续PEBS采样,则PEBS还将尝试访问DS缓冲区,以增加
PEBS缓冲区索引。因此,PEB中断和PEB本身都将尝试写入相同的DS存储区域。这显然指向PEBS中断处理程序和PEBS模块之间的竞争条件

为了避免这种竞争情况,需要禁用PEBS采样(通过禁用
IA32\u PEBS\u ENABLE
msr寄存器中的标志)。此外,中断处理程序还必须禁用所有事件计数器。这是内核中的最新版本


但是,如果PEB中断导致CPU上的节流过多,则可以发生性能记录(PERF_RECORD_THROTTLE事件,但这当然是,不是一个PEBS_采样事件,而是一个性能记录事件。

当中断被维修时,PEBS采样从不发生。

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

PEBS中断处理程序将把
PEBS缓冲区索引
重置回
PEBS缓冲区基础
的起始位置。如果要继续PEBS采样,则PEBS还将尝试访问DS缓冲区,以增加
PEBS缓冲区索引。因此,PEB中断和PEB本身都将尝试写入相同的DS存储区域。这显然指向PEBS中断处理程序和PEBS模块之间的竞争条件

为了避免这种竞争情况,需要禁用PEBS采样(通过禁用
IA32\u PEBS\u ENABLE
msr寄存器中的标志)。此外,中断处理程序还必须禁用所有事件计数器。这是内核中的最新版本


但是,如果PEBS中断导致CPU上的节流过多,您可以有一个PERF\u RECORD\u THROTTLE事件,但这当然不是PEBS\u示例事件,而是一个PERF\u RECORD事件。

从您的评论中,当PEBS中断处理程序被服务时,似乎应该禁用PEBS。PEB与其他中断处理程序没有任何冲突,可以在中断上下文中生成样本,而无需竞争。如果我错了,请纠正我。PEBS不会与其他中断处理程序发生任何冲突。据我所知,只有在初始化、处理器重置以及系统移动到SMM(系统管理模式)或ia-32模式时,才会避免在PEBS期间保存数据存储。从您的评论来看,在提供PEBS中断处理程序时,似乎应该禁用PEBS。PEB与其他中断处理程序没有任何冲突,可以在中断上下文中生成样本,而无需竞争。如果我错了,请纠正我。PEBS不会与其他中断处理程序发生任何冲突。据我所知,只有在初始化、处理器重置以及系统移动到SMM(系统管理模式)或ia-32模式时,才会避免在PEBS期间保存数据存储。