mmiowb的使用场景

转:http://blog.chinaunix.net/uid-25871104-id-2880884.html
摘抄memory-barrier.txt中关于mmiowb的一部分,以解答mmiowb的用法。
----------

在某些情况下(特别是涉及到NUMA的情况), 两个CPU上发起的属于两个spinlock临界区的IO
访问可能被PCI桥看成是交错发生的, 因为PCI桥并不一定参与cache一致性协议, 以至于无
法响应读内存屏障.

例如:

        CPU 1                                CPU 2
        ===============================      ===============================
        spin_lock(Q)
        writel(0, ADDR)
        writel(1, DATA);
        spin_unlock(Q);
                                             spin_lock(Q);
                                             writel(4, ADDR);
                                             writel(5, DATA);
                                             spin_unlock(Q);

PCI桥可能看到的是:

        STORE *ADDR = 0, STORE *ADDR = 4, STORE *DATA = 1, STORE *DATA = 5

这可能会引起硬件操作的错误.

这里所需要的是, 在释放spinlock之前, 使用mmiowb()作为干预, 例如:

        CPU 1                                CPU 2
        ===============================      ===============================
        spin_lock(Q)
        writel(0, ADDR)
        writel(1, DATA);
        mmiowb();
        spin_unlock(Q);
                                             spin_lock(Q);
                                             writel(4, ADDR);
                                             writel(5, DATA);
                                             mmiowb();
                                             spin_unlock(Q);

这样就能确保CPU 1的两次STORE操作先于CPU 2的STORE操作被PCI桥所看到.

此外, 对于同一硬件设备在进行STORE操作之后再进行LOAD操作, 可以省去mmiowb(), 因为
LOAD操作将强制STORE操作在开始LOAD之前就完成:

        CPU 1                                CPU 2
        ===============================      ===============================
        spin_lock(Q)
        writel(0, ADDR)
        a = readl(DATA);
        spin_unlock(Q);
                                             spin_lock(Q);
                                             writel(4, ADDR);
                                             b = readl(DATA);
                                             spin_unlock(Q);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值