2

仔细阅读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 *)&current_thread_info()->flags);   // Workaround for erratum AAI65 for the Xeon 7400 series

        __monitor((void *)&current_thread_info()->flags, 0, 0);
        smp_mb();
        if (!need_resched())
            __mwait(ax, cx);
    }
}

smp_mb()是一个宏asm volatile("mfence":::"memory")

为什么这里有必要?我理解为什么需要编译器内存屏障,而不是硬件内存屏障。

4

0 回答 0