免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: vonnyfly

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

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2011-09-26 15:09 |显示全部楼层
回复  asuka2001
关中断跟禁止抢占之间没有关系么?
关掉中断之后,时钟肯定也关了,也就调度相关的代码 ...
vonnyfly 发表于 2011-09-26 15:06


为什么3不可能??

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2011-09-26 15:12 |显示全部楼层
刚刚回复的时候没回复完,那里是:
  1. spin_lock_irqsave本身应该禁止了抢占吧,毕竟获取了自旋锁!

  2. 至于关中断和抢占,好象没啥联系,preempt_count里只有针对软中断,硬中断,和关闭抢占的计数器。

  3. 抢占的时机不仅仅和中断有关,比如解除自旋锁的时候也会恢复抢占,并且可能导致重新调度吧???
复制代码

论坛徽章:
0
发表于 2011-09-26 15:19 |显示全部楼层
回复 6# vonnyfly


    linux的实时进程有两种调度策略,SCHED_FIFO和SCHED_RR,SCHED_FIFO是简单的队列调度,并且没有timeslice的限制,谁先来谁运行,除非是阻塞或者主动yield,否者将一直占用CPU,即使关中断也不能阻止优先级高的进程被调度运行。

论坛徽章:
0
发表于 2011-09-26 15:28 |显示全部楼层
回复 6# vonnyfly


   还有,中断是随时产生的,因此在中断服务程序被调用的时候,不能依赖于任何进程的状态,也就不能调用schedule()等与进程运行环境有关的函数,第3点中的驱动程序中调用schedule应该不成立吧。
   local_irq_save只是关闭了当前CPU上的中断,但并不能阻止其他CPU上的进行进程调度,就可能调度到某个进程,这个进程也要访问同样的临界区。

论坛徽章:
0
发表于 2011-09-26 16:13 |显示全部楼层
spin_lock_irqsave本身应该禁止了抢占吧,毕竟获取了自旋锁!

至于关中断和抢占,好象没啥联系,pre ...
asuka2001 发表于 2011-09-26 14:55

spin_lock_irqsave 应该也关中断吧。

论坛徽章:
0
发表于 2011-09-27 13:27 |显示全部楼层
为什么3不可能??
zylthinking 发表于 2011-09-26 15:09



    拿了锁又去主动调用调度是代码bug

论坛徽章:
0
发表于 2011-09-27 16:23 |显示全部楼层
回复 1# vonnyfly

假设有这么个情况:
1、CPU-1在进程A的上下文调用了spin_lock_irqsave;
2、CPU-2调用wake_up_process唤醒了CPU-1上的进程B,由于进程B的优先级高于进程A,进程A的TIF_NEED_RESCHED标记被设置。(CPU-2还会用IPI通知CPU-1进行resched,但是CPU-1禁用了中断而不会响应);
3、CPU-1调用了某某函数,这个函数包含了preempt_disable和preempt_enable(没有规定关中断的情况下不能调用这样的函数吧~);
那么,如果spin_lock_irqsave没有preempt_disable,第3步中的preempt_enable将触发preempt_check_resched,从而让进程B抢占掉进程A。

论坛徽章:
0
发表于 2011-09-27 20:32 |显示全部楼层
不光从中断返回,preempt_enable()也是一个潜在的主动调度的测试点。spin_lock_irqsave只有关了抢占,才能保证在临界区成对出现的preempt_disable()/preempt_enable()不会造成伤害。不然这种代码就不能放在临界区中了。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-10-02 19:28 |显示全部楼层
自旋锁可以防止其它处理器抢占本处理器,但是如果本处理器不关本地中断,还是会被本处理的其它进程抢占.
若其它进程也申请自旋锁,就会导致自旋锁的死锁.

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2011-10-03 10:52 |显示全部楼层
回复 17# kouu

有道理,但实际上代码(3.0.4)里面,preempt_enable检查到有调度需求后用调用preempt_schedule():
  1. /*
  2.          * If there is a non-zero preempt_count or interrupts are disabled,
  3.          * we do not want to preempt the current task. Just return..
  4.          */
  5.         if (likely(ti->preempt_count || irqs_disabled()))
  6.                 return;
复制代码
中断关闭会被照顾。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP