1

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

如果您的 seqlock 可以从中断处理程序中访问,您应该使用 IRQ 安全版本来代替:

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

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

4

1 回答 1

1

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

PS LDD3 - 本教程非常好,但不是那么相关。


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

于 2019-12-04T17:22:07.760 回答