免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: vonnyfly
打印 上一主题 下一主题

spin_lock_irqsave关中断后,为什么要再禁止抢占呢,不多余吗? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2014-07-19 16:28 |只看该作者

这个主要是兼容非SMP的代码吧。
如果是single core的,spinlock变成禁抢占。
   

论坛徽章:
0
32 [报告]
发表于 2014-08-04 17:11 |只看该作者
回复 1# vonnyfly


    不多余, 因为如有使用方式是一个合法的使用方式:

        local_irq_disable();
        spin_lock(&foo);

        spin_unlock_irq(&foo);

如果spin_lock_irq()中不关抢占,那么上述的spin_unlock_irq()也不会开抢占,这样上述合法的使用方式反而产生一个preempt_count的泄漏(来自spin_lock(&foo))

论坛徽章:
0
33 [报告]
发表于 2015-02-02 16:24 |只看该作者
回复 32# njubee

感觉这个情况有点儿牵强


说下我的看法
首先
spin_unlock_irq 会调用preempt_enable 触发重新调度
这就保证了任务的实时性
因为虽然自旋锁 要求临界区占用时间足够短
但其实 真正的开发员很难保证
那么当当前任务退出 临界区后 就很有必要去重新调度(这点需注意软中断过多的时候,会触发ksoftirqd 调度软中断。这个时候重新调度就更有必要了)


如果你的系统对实时性没有要求。你完全可以关闭CONFIG_PREEMPT
那么 preempt_disable 和preempt_enable相关的都会被编译为空

而之所以不直接使用preempt_check_resched
其实是为了解决嵌套的情况

preempt_disable
spin_irq_lock
spin_unlock_irq
preempt_enable

这是一个很常用的用法。比如在系统调用中 一般会用up down禁止其他进程的竞争。而很少的时候 在up 和down之间需要禁止中断
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP