- 论坛徽章:
- 0
|
原帖由 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, 这样可以防止堆栈溢出. |
|