【发布时间】:2012-10-27 03:27:32
【问题描述】:
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()呢?
【问题讨论】:
-
@cnicutar.你确定吗?我不这么认为。每个 CPU 内核都使用 schedule() 来选择要运行的作业。在具有多核的 SMP 系统中,每个核都有一个专用的执行路径,就像 UP 系统一样。在这种情况下,本地 IRQ 被禁用,因此该内核上的调度轮被阻塞。可能抢占发生在另一个 CPU 上,但这不会影响这个 CPU 上的执行路径,我认为它们是专用于执行级别的。
标签: c linux kernel spinlock smp