【发布时间】:2014-11-30 05:22:22
【问题描述】:
只是好奇为什么spin_lock_irqsave在禁用本地中断后需要禁用抢占。
static inline unsigned long __raw_spin_lock_irqsave(raw_spinlock_t *lock)
{
unsigned long flags;
local_irq_save(flags);
preempt_disable(); ===> can preemption happen with interrupt disabled?
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
...
}
只有在启用中断的情况下才能进行抢占,因此无需担心禁用中断后的抢占。
【问题讨论】:
-
来自 Documentation/preempt-locking.txt:但请记住,“irqs disabled”是一种从根本上不安全的禁用抢占方式 - 任何将抢占计数减少到 0 的 spin_unlock() 都可能触发重新调度。一个简单的 printk() 可能会触发重新安排。因此,仅当您知道受影响的代码路径不执行任何此操作时,才使用此隐式抢占禁用属性。最好的策略是仅将其用于您编写且不调用复杂函数的小型原子代码。
标签: kernel spinlock preemption