linux内核的ext2函数ext2_statfs()中的内存障碍

时间:2014-08-31 08:31:26

标签: c assembly linux-kernel memory-barriers ext2

有谁可以解释为什么linux内核的ext2功能 int ext2_statfs (struct dentry * dentry, struct kstatfs * buf)

问题smp_rmb()smp_wmb() else if (sbi->s_blocks_last != le32_to_cpu(es->s_blocks_count)) { 案件?

这是在上游内核提交2235219b7721b8e74de6841e79240936561a2b63中添加的,它省略了不必要的.statfs计算,但无法理解为什么添加了内存屏障。

1 个答案:

答案 0 :(得分:3)

由于该功能首先执行 spin_lock (并在最后解锁),

spin_lock(&sbi->s_lock);

它受到并发访问的保护。那么为什么需要 smp_wmb smp_rmb ......

至于写操作,

    sbi->s_overhead_last = overhead;
    smp_wmb();
    sbi->s_blocks_last = le32_to_cpu(es->s_blocks_count);

似乎 smp_wmb 会阻止任何编译器或处理器优化(因为在内存访问方面两个写入之间没有依赖关系)会改变两个赋值的顺序。由于 ext2_statfs 中没有并发访问,问题可能发生在另一个可能具有类似行为的函数中,并检查是否存在块计数更改,如果没有,则使用{{1的开销 - 如果另一个线程在这个时候,在另一个函数中,在两个写操作的中间以错误的顺序,这将是错误的。

这可能是一种预防措施,因为对 sbi 属性的任何类似的写访问都会事先 spin_lock (使用相同的自旋锁)。此外,它还增强了这两个操作必须按此顺序完成的事实。

至于读访问,需求不太明显,需要进一步分析 sbi es 块之间的依赖关系。