【发布时间】:2013-05-09 20:19:03
【问题描述】:
我正在阅读英特尔性能计数器监视器 (http://software.intel.com/en-us/articles/intel-performance-counter-monitor-a-better-way-to-measure-cpu-utilization) 附带的特定于型号的寄存器 (MSR) 驱动程序内核扩展的源代码。由于 MSR/性能计数器的独立副本存储在不同的 CPU 上,因此有必要指定从哪个 CPU 读取。这是通过调用 mp_rendezvous_no_intrs 函数来完成的。
mp_rendezvous_no_intrs(cpuReadMSR, (void*)idatas);
这会导致每个处理器检查它是否是正确的处理器编号,如果是,则从 MSR 读取数据:
void cpuReadMSR(void* pIData){
pcm_msr_data_t* data = (pcm_msr_data_t*)pIData;
volatile uint cpu = cpu_number();
if(data->cpu_num == cpu)
{
data->value = RDMSR(data->msr_num);
}
}
我的问题是:关闭中断(通过 mp_rendezvous_no_intrs 完成)是否足以导致运行 cpuReadMSR 函数的线程始终保持在同一个 CPU 上?如果不是,我担心以下失败场景:
- cpu 使用 cpu_number() 读取其数字 id,确定它是正确的 CPU,并开始读取 MSR。
- 线程被调度程序抢占并移动到不同的 CPU。
- 已读取 MSR,但现在从不同的 CPU 读取,因此给出了错误的值。
【问题讨论】:
标签: kernel kernel-module mach