spin_lock和raw_spin_lock()有什么区别?

9
在Linux内核中有每个自旋锁的原始变体,我想知道它的用法?例如:
raw_spin_lock(),raw_spin_lock_irqsave()等。
2个回答

9
主要区别是spin_lock变体映射到非RT的raw_spin_lock变体,而如果CONFIG_PREEMPT_RT被设置,则它们映射到可以睡眠的rt_spin_lock
通过将spin_lock与休眠和非休眠变体解耦,取决于我们是否为RT,可以使spin_lock API在整个内核代码中保持一致。

9
spin_lock*函数与raw_spin_lock*函数相同,只是在启用锁调试(CONFIG_DEBUG_LOCK_ALLOC)时,会执行一些额外的运行时检查,例如检查死锁等锁操作。这些检查由lockdep子系统执行。
通常情况下,应尽可能使用spin_lock*函数。
仅在非常棘手的锁定策略的极少数情况下,当lockdep可能产生虚假警告时,才可以使用raw_spin_lock*函数。
此外,出于减少内存使用或性能原因,可以优先选择raw_*函数。但应该实际测量时间/空间,反映使用这些优化带来的重大收益。

当lockdep可以产生错误警告?在-rt正常spin_lock中,可以睡眠而raw_spin_lock不行,这是真的吗? - Saurabh Sengar
那么PREEMPT_RT补丁如何?据说它可以将自旋锁转换为实时互斥锁? - Pavel Šimerda
@PavelŠimerda:PREEMPT_RT情况似乎在另一个答案中有描述。有什么问题吗? - Tsyvarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接