免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2011-12-20 13:38 |只看该作者
kouu 发表于 2011-09-27 16:23
回复 1# vonnyfly

假设有这么个情况:

按照大伙们的意思,那么主要问题在于  自旋锁关中断保护区域内部主动调用调度schedule相关的函数问题上。因为关中断后不可能因为时间片的问题进行中断调度并抢占,只能通过主动调度来进行进程切换的。而在这个区域,如果没有禁止抢占,即没有调用disable_preempt,那么此时preempt_count=0,如果这之间调用preempt_enable,那么会出现不配对情况,preemp_count<0,bug,而且
  1. asmlinkage void __sched notrace preempt_schedule(void)
  2. {
  3.         struct thread_info *ti = current_thread_info();

  4.         /*
  5.          * If there is a non-zero preempt_count or interrupts are disabled,
  6.          * we do not want to preempt the current task. Just return..
  7.          */
  8.         if (likely(ti->preempt_count || irqs_disabled()))
  9.                 return;
复制代码
if语句永远成立的,因为disable了中断,所以即使有进程标记了TIF_NEED_RESCHED,也不会调度。对么???

论坛徽章:
0
22 [报告]
发表于 2011-12-20 13:40 |只看该作者
tempname2 发表于 2011-10-03 10:52
回复 17# kouu

有道理,但实际上代码(3.0.4)里面,preempt_enable检查到有调度需求后用调用preempt_sch ...

这恰恰有问题呀,if在关中断下永远成立,那不就不会产生抢占吗???

论坛徽章:
1
午马
日期:2013-09-10 11:03:08
23 [报告]
发表于 2011-12-20 21:13 |只看该作者
昨天 刚看了lkd的自旋锁,说下我的看法吧
若果没有禁止本地中断,那么中断处理程序就会打断持有锁的内核代码,即 可能去争用这个已经被持有的自旋锁,那么这就会相当于死锁了。

书上有一点说的不错,就是 关闭的只是当前处理器的中断,如果中断发生在不同的处理器上,即使中断处理程序在同一个锁上自旋,也不会妨碍锁的持有者 释放锁,也就是别的处理器上的中断处理程序 请求被持有的锁时 不会 产生死锁

在单处理器上 虽然编译时 抛弃了锁机制,但是spin_lock_irqsave() 等函数还是需要关闭中断,以禁止中断处理程序访问共享数据,枷锁与解锁分别可以禁止和允许内核抢占

论坛徽章:
0
24 [报告]
发表于 2013-03-05 18:44 |只看该作者
看到自旋锁有同样的疑问, 我感觉看了17楼和20楼的回复已经能够解答楼主和我的疑问了。

论坛徽章:
0
25 [报告]
发表于 2013-03-06 11:23 |只看该作者
我感觉17楼和20楼的回答证明了 spin_lock_irqsave  加入 preempt_disable 是多余的

论坛徽章:
0
26 [报告]
发表于 2013-03-14 19:49 |只看该作者
禁用抢占即便多余也无什么副作用。估计是程序员拷贝代码的缘故吧

#define _spin_lock(lock)        \
do { \
        preempt_disable(); \
        _raw_spin_lock(lock); \
        __acquire(lock); \
} while(0)

#define _spin_lock_irqsave(lock, flags) \
do {        \
        local_irq_save(flags); \
        preempt_disable(); \
        _raw_spin_lock(lock); \
        __acquire(lock); \
} while (0)

_spin_lock_irqsave比_spin_lock多了一句local_irq_save(flags);其它是照抄。

论坛徽章:
0
27 [报告]
发表于 2013-03-15 10:42 |只看该作者
嗯,那是3.0的版本增加的,和2.6的不一样。3.0里面可能是多余的,2.6里面估计少不了。
hanshu830 发表于 2013-03-06 11:23
我感觉17楼和20楼的回答证明了 spin_lock_irqsave  加入 preempt_disable 是多余的

论坛徽章:
0
28 [报告]
发表于 2013-03-15 11:07 |只看该作者
我看了2.6.24的preemp_schedule(),也已经照顾了irq关闭的情况。所以应该是多余的,不过禁止抢占了没有副作用,这是最重要的。

论坛徽章:
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
29 [报告]
发表于 2013-03-15 11:40 |只看该作者
没问题。

要的就是这个“照顾”:在开抢占时判断,即使能抢占,但是如果是在关中断中也不抢占!

这样就规避了kouu说的那个case,从而看上去“关中断就不用关抢占了”。

回复 22# vonnyfly


   

论坛徽章:
0
30 [报告]
发表于 2014-07-18 10:35 |只看该作者
回复 17# kouu

请教一下问题 
preempt_schedule
{
if (likely(ti->preempt_count || irqs_disabled()))
                return;
}

那么这个时候 也会直接返回 并不会调用到schedule();
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP