免费注册 查看新帖 |

Chinaunix

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

内核定时器与软中断 [复制链接]

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
31 [报告]
发表于 2010-09-08 00:04 |只看该作者
本帖最后由 smalloc 于 2010-09-08 00:24 编辑

塑料袋兄讲的不错.
ksoftirqd嵌套ksoftirqd自然不可能.每处理器只有一个ksoftirqd.

不过ULK3上是说有5处,而不是2处.
两一个重要的地方是local_bh_enable中也调用do_softirq.
另外程序保证是各级上的软中断处理函数不相互打断,而不是do_softirq之间不相互打断.

从代码细节上讲,do_softirq内部是有一部分互斥的,就是利用那个preempt_count中的字段.
从do_softirq到__do_softirq串起来看大致为: (忽略不相干代码)
1, in_interrupt()判断是否退出
2, 关本地中断
3, 禁止本地bh
4, 开中断
5, 调用处理函数
...
...

从中可以看出,判断和禁止(既 1 和 3 )并不是原子的.
那么可以设想,在进程上下文调用local_bh_enable时或者ksoftirqd中,  进入do_softirq. 当执行到1以后,仍然可以被另一个中断结束时的do_softirq嵌套.
local_bh_enable中有个配置 CONFIG_TRACE_IRQFLAGS
可以阻止这个情况的发生.
还好的是从第2步开始后就不能在发生这种嵌套了.于是处理函数全部都被保护起来.
这段代码看起来像是一个锁. 先测试, 然后上锁.
在单处理器的环境中.即使2步不是原子的,也是安全的,但是在可抢占的环境下不起作用.
在多处理器环境中的同步需要的是自旋锁, 对一个处理器而言_bh仅仅防止嵌套.

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
32 [报告]
发表于 2010-09-08 05:11 |只看该作者
塑料袋兄讲的不错.
从中可以看出,判断和禁止(既 1 和 3 )并不是原子的.
那么可以设想,在进程上下文调用local_bh_enable时或者ksoftirqd中,  进入do_softirq. 当执行到1以后,仍然可以被另一个中断结束时的do_softirq嵌套.
local_bh_enable中有个配置 CONFIG_TRACE_IRQFLAGS
可以阻止这个情况的发生.
smalloc 发表于 2010-09-08 00:04


我觉得不是原子的无所谓.

关键在于: 先local_bh_disable, 然后再执行软中断.

只要判断过一次是否in_interrupt, 那么这个路径中再次做in_interrupt的判断时,结果将与以前的判断一致. 即使抢占,即使SMP.


1) 事先作了(!in_interrupt)的判断
2) 随后执行local_bh_disable. 这时根本不需要再次判断in_interrupt, 如果判断的话,结果将与1)中的判断一致.
3) 第二步完成了__do_softirq之间的互斥,这时可以真正开始软中断的处理

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
33 [报告]
发表于 2010-09-08 11:05 |只看该作者
多谢塑料袋兄和smalloc兄精彩分析

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
34 [报告]
发表于 2010-09-08 15:50 |只看该作者
回复 32# 塑料袋


    恩,判断和关软中断非原子确实在任何时候都能正确执行.
不过在可抢占内核的情况下, 其实还要得益于关软中断后是禁止抢占的.
否则仅通过这2步也达不到效果.

随便提个问题, 在ksoftirq和local_bh_enable中
整个do_softirq都是被抢占禁止保护的. 我刚开始很困惑. 按前面的分析应该无须保护才对.
后来才发现有个 CONFIG_HOTPLUG_CPU 的配置.
可能是说某个要被down的处理器上正在执行的进程,可能被抢占,然后像load_balance()一样把这个进程换到其他处理器上去.
这是2.6.XXX中ksoftirq中的一段注释:
  1.                         /* Preempt disable stops cpu going offline.
  2.                            If already offline, we'll be on wrong CPU:
  3.                            don't process */
复制代码
在local_bh_enable中仅仅注释为:
  1.         /*
  2.          * Keep preemption disabled until we are done with
  3.          * softirq processing:
  4.          */
复制代码
以上是猜测,不太明白其中的道理.

论坛徽章:
0
35 [报告]
发表于 2010-09-11 10:06 |只看该作者
在一台运行 Linux 的计算机中,CPU 在任何时候只会有如下四种状态:

【1】 在处理一个硬中断。

【2】 在处理一个软中断,如 softirq、tasklet 和 bh。

【3】 运行于内核态,但有进程上下文,即与一个进程相关。

【4】 运行一个用户态进程。

其中,【1】、【2】和【3】是运行于内核空间的,而【4】是在用户空间。其中除了【4】,其他状态只可以被在其之上的状态抢占。比如,软中断只可以被硬中断抢占。

论坛徽章:
0
36 [报告]
发表于 2010-09-21 16:52 |只看该作者
接着大家的帖子,问各位大侠一个问题,困惑我许久。
对一个有2个cpu的系统来说,softirq的执行位置如下:
*ksoftirqd/0;
*ksoftirqd/1;
*irq_exit(); //all harware irq
*some other places. eg:network
softirq能不能嵌套或者并行执行是看thread_info->preempt_count是否有硬件,软件中断或者nmi设置。
thread_info是每个进程的内核栈中的栈底的一个结构。内核线程也会有一个。
那么当检查preempt_count的时候,至少可以有两个ksoftirqd并行运行两个softirq,相同的softirq也可以,因为他们检查的不是相同的preempt_count. 而softirq的设置是所有cpu都一样的。
我觉得这个可以肯定。

但这里我有一个问题,对于硬件中断来说,中断上下文对于每个cpu都会有一个内核栈(4K),那么这个thread_info()是否每个中断上下文也会有一个?如果没有,中断上下文中调用__do_softirq(),然后调用in_interrup()检查的时候是对应谁的thread_info?不可能是被中断的线程的,因为现在每个中断上下文都有自己的内核栈。
假如每个终端上下文也有一个thread_info,那么对于2个cpu的系统是否会可能有4个__do_softirq()在执行?我看到LKD上面不停地说softirq可能会并行执行的,是否指的这个意思?
至于softirq的嵌套执行,因为有in_interrup的检查,不会嵌套。但并行执行是可能的。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
37 [报告]
发表于 2010-09-21 17:00 |只看该作者
softirq能不能嵌套或者并行执行

同一个 CPU 上软中断不能嵌套或者并行

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
38 [报告]
发表于 2010-09-21 17:34 |只看该作者
thread_info就是被中断的进程的
2.4中断使用进程栈这个没问题
2.6中ULK3有讲解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP