Linux 自旋锁真的需要DMB吗?

Linux 自旋锁真的需要DMB吗?,linux,synchronization,locking,arm,memory-barriers,Linux,Synchronization,Locking,Arm,Memory Barriers,我正在使用双皮质A9系统,我一直在尝试 确切理解为什么自旋锁函数需要使用DMB。看来 只要合并存储缓冲区刷新了锁值 应在解锁芯上的L1中结束,且SCU应 使另一个核心的L1中的值无效或更新。 这足以保持一致性和安全锁定,对吗?及 STREX不会跳过合并存储缓冲区,这意味着我们不会 甚至需要冲水吗 DMB似乎是一把钝锤,特别是因为它 默认为系统域,这可能意味着一路写入 到主内存,这可能很昂贵 锁中的DMB是不是作为不需要的司机的解决办法 正确使用smp_mb 根据性能计数器,我目前看到大约5%的

我正在使用双皮质A9系统,我一直在尝试 确切理解为什么自旋锁函数需要使用DMB。看来 只要合并存储缓冲区刷新了锁值 应在解锁芯上的L1中结束,且SCU应 使另一个核心的L1中的值无效或更新。 这足以保持一致性和安全锁定,对吗?及 STREX不会跳过合并存储缓冲区,这意味着我们不会 甚至需要冲水吗

DMB似乎是一把钝锤,特别是因为它 默认为系统域,这可能意味着一路写入 到主内存,这可能很昂贵

锁中的DMB是不是作为不需要的司机的解决办法 正确使用smp_mb

根据性能计数器,我目前看到大约5%的
我的系统周期在DMB导致的暂停中消失。

SMP情况下需要DMB,因为其他处理器可能会看到内存访问以不同的顺序进行,而没有DMB,即从第二个内核的角度来看,在锁定之前,可能会从关键部分内部进行访问


因此,第二个核心可以看到自己持有锁,也可以看到在另一个核心上运行的Critital部分中的更新,破坏了一致性。

我发现这些文章可能会回答您的问题:

特别是:

您将注意到在获取锁后发出的数据存储器屏障(DMB)指令。DMB保证在内存屏障之后进行的所有内存访问之前,系统中的所有其他CPU都会观察到内存屏障之前的所有内存访问。如果您认为一旦获取了锁,程序将访问锁所锁定的数据结构,这就更有意义了。上面锁函数中的DMB确保在访问锁后观察对锁定数据结构的访问


这可能是一个完全错误的评论,因为我对这种低级别的操作不是很有经验,但肯定会使用自旋锁来保护其他内存位置不受多次访问(可能不在同一缓存页中的位置)。。因此,尽管自旋锁本身可能是一致的,但您仍然需要一个内存屏障来确保缓存之间的其他内存访问是一致的。好的,我明白您的意思,但该逻辑是否适用于锁定功能以及解锁功能?锁不必等待关键部分之外的访问完成。在解锁中,我希望在解锁之前有一个完整的内存屏障,以便在更新锁标志之前,确保在关键部分期间发生的任何更改被刷新,并且,在更新锁定标志之前,必须完成临界段期间发生的任何读取操作。即使在缓存问题之外,我认为内存障碍对于告诉CPU什么样的指令重新排序可以通过程序中的不同点也是很重要的。是的,我知道解锁就是这种情况,但是锁呢?锁操作必须以原子方式测试锁是否已经拥有,并同时获得它的所有权。这本身可能就足以需要一个完整的内存屏障。您需要一个内存屏障,以确保在关键部分期间对锁定资源的内存操作不会在锁定序列之前发生。通过“发生”,我还将其含义扩展到读或写的整个过程,包括缓存等,这可能发生在实际加载或存储指令执行之前很久。这主要是由无序执行引起的,对吗?