3

谁能解释为什么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 计算,但无法理解为什么要添加内存屏障。

4

1 回答 1

3

由于该函数从执行spin_lock开始(并在最后解锁),

spin_lock(&sbi->s_lock);

它受到保护以防止并发访问。那么为什么需要smp_wmbsmp_rmb ...

至于写操作,

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

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

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

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

于 2014-08-31T11:25:22.643 回答