gpt4 book ai didi

c - Linux 内核 : Spinlock SMP: Why there is a preempt_disable() in spin_lock_irq SMP version?

转载 作者:IT王子 更新时间:2023-10-29 00:12:05 33 4
gpt4 key购买 nike

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 都被禁用,所以应该没有软中断发生,也没有 tick to kick schedule wheel。我认为当前路径是安全的。那么为什么会有 preempt_disable() 呢?

最佳答案

据我所知,Dave Miller 于 2002 年 12 月 4 日将 preempt_disable() 调用添加到相当多的锁定原语中,包括 spin_lock_irq,并且在 2.5.51 中发布。提交信息没有帮助;它只是说“[SPINLOCK]:修复非 SMP nopping 自旋/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 ...

关于c - Linux 内核 : Spinlock SMP: Why there is a preempt_disable() in spin_lock_irq SMP version?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13263538/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com