仔细阅读Linux x86 idle loop,我注意到monitor
和mwait
之间存在内存障碍,我无法弄清楚为什么必要。
void mwait_idle_with_hints(unsigned long ax, unsigned long cx) {
if (!need_resched()) {
if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) // True for Intel Xeon 7400 series CPUs
clflush((void *)¤t_thread_info()->flags); // Workaround for erratum AAI65 for the Xeon 7400 series
__monitor((void *)¤t_thread_info()->flags, 0, 0);
smp_mb();
if (!need_resched())
__mwait(ax, cx);
}
}
smp_mb()
是asm volatile("mfence":::"memory")
的宏。
为什么这里有必要?我理解为什么需要编译器内存屏障,而不是硬件内存屏障。