Linux kernel 关于记忆障碍需要澄清
我正在阅读memory-barrier.txt文件,如下所述 请澄清我的疑问。 1) 例如,如果CPU1获得了锁,PCI桥如何查看存储 *存储前的地址=4*数据=1 获取VS I/O访问 在某些情况下(特别是涉及NUMA),在 两个不同CPU上的两个自旋锁定部分可能被 PCI桥,因为PCI桥不一定参与 缓存一致性协议,因此无法发出所需的 读记忆障碍 例如:Linux kernel 关于记忆障碍需要澄清,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在阅读memory-barrier.txt文件,如下所述 请澄清我的疑问。 1) 例如,如果CPU1获得了锁,PCI桥如何查看存储 *存储前的地址=4*数据=1 获取VS I/O访问 在某些情况下(特别是涉及NUMA),在 两个不同CPU上的两个自旋锁定部分可能被 PCI桥,因为PCI桥不一定参与 缓存一致性协议,因此无法发出所需的 读记忆障碍 例如: CPU 1 =============================== spin_lock(Q) writel(0, ADDR) wri
CPU 1
===============================
spin_lock(Q)
writel(0, ADDR)
writel(1, DATA);
spin_unlock(Q);
CPU 2
===============================
spin_lock(Q);
writel(4, ADDR);
writel(5, DATA);
spin_unlock(Q);
may be seen by the PCI bridge as follows:
STORE *ADDR = 0, STORE *ADDR = 4, STORE *DATA = 1, STORE *DATA = 5
which would probably cause the hardware to malfunction.
在3.19内核中,writel()在内部具有硬件屏障调用。mmiowb()调用在arm中被替换为nothing,在x86中被替换为编译器屏障。自旋解锁内部提供的编译屏障。因此,kernel.org/doc/documentation/memory-barriers.txt上的文档需要更正PCI桥按照从CPU发送到它的顺序查看存储。在3.19内核中,writel()内部具有硬件屏障调用。mmiowb()调用在arm中被替换为nothing,在x86中被替换为编译器屏障。自旋解锁内部提供的编译屏障。因此,目前的文档需要更正