有谁可以解释为什么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计算,但无法理解为什么添加了内存屏障。
答案 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 块之间的依赖关系。