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 都被禁用,所以应该不会发生软中断,也不会出现启动调度轮的滴答声。我认为目前的道路是安全的。那么为什么会有一个preempt_disable()
?