Linux内核中的原始代码为:
static inline void __raw_spin_lock_irq(raw_spinlock_t *lock)
{
local_irq_disable();
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);
}
我认为在禁用本地IRQ之后,没有执行路径可以抢占当前路径。
因为所有常见的硬IRQ都被禁用,所以不应发生softirq,也不应滴答作响以踢时间表。我认为目前的道路是安全的。那么为什么会有
preempt_disable()
? 最佳答案
据我所知,Dave Miller在2002年12月4日将preempt_disable()
调用添加到了很多锁定原语中,包括spin_lock_irq
,并在2.5.51中发布。提交消息没有帮助;它只是说:“[SPINLOCK]:修复非SMP noping spin/rwlock宏。”
我相信Proper Locking Under a Preemptible Kernel文档足以说明这一点。标题为“使用中断禁用进行预防”的最后一节开始,
It is possible to prevent a preemption event using local_irq_disable and
local_irq_save. Note, when doing so, you must be very careful ...