Linux内核:Spinlock SMP:为​​什么spin_lock_irq SMP版本中有preempt_disable()?

Linux内核:Spinlock SMP:为​​什么spin_lock_irq SMP版本中有preempt_disable()?,第1张

概述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 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 andlocal_irq_save.  Note,when doing so,you must be very careful ...
总结

以上是内存溢出为你收集整理的Linux内核:Spinlock SMP:为​​什么spin_lock_irq SMP版本中有preempt_disable()?全部内容,希望文章能够帮你解决Linux内核:Spinlock SMP:为​​什么spin_lock_irq SMP版本中有preempt_disable()?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1039906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存