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 ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。