为什么读取访问需要 IRQ 安全版本的 seqlock?

Why need IRQ-safe version of seqlock for read access?

当写访问受seqlock 保护的共享资源时,写入者必须在进入临界区之前获得独占锁。因此,与自旋锁一样,使用 seqlock 进行写访问具有常见变体(如 *_irqsave 和 *_bh)是有意义的。但是 LDD3(第 128 页)说:

If your seqlock might be accessed from an interrupt handler, you should use the IRQ-safe versions instead:

unsigned int read_seqbegin_irqsave(seqlock_t *lock,
                                   unsigned long flags);
int read_seqretry_irqrestore(seqlock_t *lock, unsigned int seq,
                             unsigned long flags);

据我了解,由于它是为读者能够自由访问共享资源而设计的(仅在最后检查一致性并在需要时重试),因此读取访问被调度程序中断或硬件中断。我错过了什么吗?谢谢

从 3.9 内核开始没有这样的函数。
一般来说,你是对的:seqlock 读者应该能够处理不一致的数据
所以如果我们读取计数器,然后一些中断到达,然后我们确保数据处于不一致状态 - 只需重新读取。

P.S。 LDD3 - 这个教程很好,但不是很相关。


在这种情况下,您可以进行一些 调查。 在这里 commit.