加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux内核:Spinlock SMP:为??什么spin_lock_irq SMP版本中有pr

发布时间:2020-12-13 16:59:44 所属栏目:Linux 来源:网络整理
导读:linux内核中的原始代码是: static inline void __raw_spin_lock_irq(raw_spinlock_t *lock){ local_irq_disable(); preempt_disable(); spin_acquire(lock-dep_map,_RET_IP_); LOCK_CONTENDED(lock,do_raw_spin_trylock,do_raw_spin_lock);} 我认为在禁用本
linux内核中的原始代码是:
static inline void __raw_spin_lock_irq(raw_spinlock_t *lock)
{
    local_irq_disable();
    preempt_disable();
    spin_acquire(&lock->dep_map,_RET_IP_);
    LOCK_CONTENDED(lock,do_raw_spin_trylock,do_raw_spin_lock);
}

我认为在禁用本地IRQ之后,没有执行路径可以抢占当前路径.

因为所有常见的硬IRQ都被禁用,所以不应该出现softirq,也没有勾选计划轮.我认为当前的道路是安全的.那么为什么会有preempt_disable()?

谢谢.

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读