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 ...

08-16 19:32