免费注册 查看新帖 |

Chinaunix

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

关于work queue与softirq的一个问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-03-14 10:10 |只看该作者
原帖由 albcamus 于 2006-3-14 10:01 发表
ksoftirqd也算是process context, 可以睡眠。 可是除非softirq重复触发, 否则在interrupt conetxt中就处理完了, 不用唤起ksoftirqd来处理。

所以尽管softirq有可能在process context执行, 我们还是要保证 ...


谢谢!懂了~~

呵呵,还是你说的清晰啊

论坛徽章:
0
12 [报告]
发表于 2006-03-14 10:32 |只看该作者
原帖由 albcamus 于 2006-3-14 10:01 发表
ksoftirqd也算是process context, 可以睡眠。 可是除非softirq重复触发, 否则在interrupt conetxt中就处理完了, 不用唤起ksoftirqd来处理。

所以尽管softirq有可能在process context执行, 我们还是要保证 ...


在一些CPU中, softirq和 interrrupt 用的不是一个context. 更确切的说,当内核配置使用4K kernel stack的时候, softirq和interrupt不能使用同一个context.  这里的context指的是 thread_info和stack.   task_struct用的都是被抢占的那个.

ksoftirqd执行的软中断处理函数也是softirq执行的那些函数, 所以ksoftirqd执行这些函数的时候,会在当前CPU屏蔽软中断的执行,在这期间不要让ksoftirqd sleep!

[ 本帖最后由 xiaozhaoz 于 2006-3-14 10:36 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2006-03-14 10:41 |只看该作者
原帖由 xiaozhaoz 于 2006-3-14 10:32 发表


在一些CPU中, softirq和 interrrupt 用的不是一个context. 更确切的说,当内核配置使用4K kernel stack的时候, softirq和interrupt不能使用同一个context.  这里的context指的是 thread_info和stack.   task_s ...

>当内核配置使用4K kernel stack的时候, softirq和interrupt不能使用同一个context
这个我看过,呵呵。 当打开这个选项, irq和softirq都有了自己的独立的栈。
>所以ksoftirqd执行这些函数的时候,会在当前CPU屏蔽软中断的执行,在这期间不要让ksoftirqd sleep!
这个我有点不理解: 引入softirqd就是让它可睡眠的啊, 不然的话, 线程化还有什么意义呢?
请教~

论坛徽章:
0
14 [报告]
发表于 2006-03-14 10:50 |只看该作者
原帖由 xiaozhaoz 于 2006-3-14 10:32 发表


在一些CPU中, softirq和 interrrupt 用的不是一个context. 更确切的说,当内核配置使用4K kernel stack的时候, softirq和interrupt不能使用同一个context.  这里的context指的是 thread_info和stack.   task_s ...


使用4k stack的时候,是不是说interrupt handler被分配了一个属于自己的4k stack,而softirq使用抢占的进程的stack?

论坛徽章:
0
15 [报告]
发表于 2006-03-14 11:01 |只看该作者
原帖由 drizztzou 于 2006-3-14 10:50 发表


使用4k stack的时候,是不是说interrupt handler被分配了一个属于自己的4k stack,而softirq使用抢占的进程的stack?


不是。 4k栈的意思是, 每个进程的栈是4k, 当发生硬件中断, 则给它分配栈; 发生softirq也是给它分配独立的栈。 只有一种情形除外: 中断是嵌套发生的,亦即当前已经在中断中了。

论坛徽章:
0
16 [报告]
发表于 2006-03-14 11:14 |只看该作者
原帖由 albcamus 于 2006-3-14 10:41 发表

>当内核配置使用4K kernel stack的时候, softirq和interrupt不能使用同一个context
这个我看过,呵呵。 当打开这个选项, irq和softirq都有了自己的独立的栈。
>所以ksoftirqd执行这些函数的时候,会在当 ...


我觉得, 引入Ksoftirqd不是让softirq可以sleep, 而是让softirq不要占用太多CPU, 用ksoftirqd后, 处理softirq内容的部分工作由ksoftirqd完成,ksoftirqd是一个prority = 120的普通任务, 在某些点可以被用户空间 或其他内核线程抢占,同样是running状态. 更确切的说, 来回处理十次, 可以被抢占一次. 代码如下:
ksoftirqd()
                while (local_softirq_pending()) {
                        /* Preempt disable stops cpu going offline.
                           If already offline, we'll be on wrong CPU:
                           don't process */
                        if (cpu_is_offline((long)__bind_cpu))
                                goto wait_to_die;
                        do_softirq();
                        //打开可抢占
                        preempt_enable_no_resched();
                       //检查是否要被调度出去,通过检查 TIF_NEED_RESCHED 标志, 这个标志被时钟中断中的调度部分scheduler_tick()设置
                        cond_resched();
                        preempt_disable();
                }

这样不会出现如网口流量很大,上层shell没有响应的问题.


在 stack = 4K的时候, softirq和hardirq都有自己的thread_info和stack, 这样可以防止堆栈溢出.

论坛徽章:
0
17 [报告]
发表于 2006-03-14 11:22 |只看该作者
>>用ksoftirqd后, 处理softirq内容的部分工作由ksoftirqd完成,ksoftirqd是一个prority = 120的普通任务, 在某些点可以被用户空间 或其他内核线程抢占,同样是running状态.

我明白了, 多谢!!

论坛徽章:
0
18 [报告]
发表于 2006-03-14 11:31 |只看该作者
sorry, 弄错了, ksoftirqd的 priority = 139, 是优先级最低的任务.

论坛徽章:
0
19 [报告]
发表于 2006-03-14 12:00 |只看该作者
原帖由 xiaozhaoz 于 2006-3-14 11:14 发表


我觉得, 引入Ksoftirqd不是让softirq可以sleep, 而是让softirq不要占用太多CPU, 用ksoftirqd后, 处理softirq内容的部分工作由ksoftirqd完成,ksoftirqd是一个prority = 120的普通任务, 在某些点可以被用户空间 ...


是不是这个意思:softirq本来是不可以被用户空间或其他内核线程抢占,但是放在ksoftirqd里执行就可以被用户空间或其他内核线程抢占了

论坛徽章:
0
20 [报告]
发表于 2006-03-14 12:18 |只看该作者

回复 19楼 drizztzou 的帖子

对, 就是这个意思。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP