免费注册 查看新帖 |

Chinaunix

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

弱问:在kernel里死循环的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-05-09 19:46 |只看该作者
原帖由 kuganlan 于 2008-5-9 18:31 发表


2.)我所说的softirq在同一个cpu上是不能并发执行的,指的是串行执行,也就是说:如果有一个softirq没有执行完,这时来了一个新的softirq,这个新的softirq不会得到执行,等到老的softirq执行完后,它才可能有机会执 ...

87年的?好小啊,真是年轻有为啊

论坛徽章:
0
12 [报告]
发表于 2008-05-10 11:35 |只看该作者
原帖由 frank_seng 于 2008-5-9 17:45 发表


1.)cpu总是会优先响应硬中断.
    答:没错,当软中断正在执行时如果来了硬中断,此时会将所有寄存器现场状态保存到当前进程的内核堆栈中,随后去处理硬中断;

2.)软中断在同一个cpu上是不能并发执行的 ...

过程描述的很详细啊,e描述的稍微有点不准确,实际上中断返回时只要发现之前的中断发生在中断上下文都不会执行当前中断的后半部

[ 本帖最后由 dengcainiao 于 2008-5-10 11:42 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2008-05-10 11:58 |只看该作者
原帖由 dengcainiao 于 2008-5-10 11:35 发表

过程描述的很详细啊,e描述的稍微有点不准确,实际上中断返回时只要发现之前的中断发生在中断上下文都不会执行当前中断的后半部

实际上这个时候是在软中断上下文,不算中断上下文哈

论坛徽章:
0
14 [报告]
发表于 2008-05-10 12:35 |只看该作者
原帖由 zx_wing 于 2008-5-10 11:58 发表

实际上这个时候是在软中断上下文,不算中断上下文哈

软中断不是中断上下文吗?当然也可以叫软中断上下文:)不过好像一般内核书籍都把这种情况统称为中断上下文吧

论坛徽章:
0
15 [报告]
发表于 2008-05-10 13:07 |只看该作者
原帖由 dengcainiao 于 2008-5-10 12:35 发表

软中断不是中断上下文吗?当然也可以叫软中断上下文:)不过好像一般内核书籍都把这种情况统称为中断上下文吧

是我搞错了,我原来以为软中断上下文不包含在in_interrupt()检查中断上下文的情况中。刚才看了一下,是包含的。你是对的

论坛徽章:
0
16 [报告]
发表于 2008-05-10 15:25 |只看该作者
   [ f] 恢复所以寄存器现场,也就是回到了你刚刚死循环中被键盘硬中断时的那个点,继续执行哪个死循环,也就是回到了[ b]中......如此往复无止境;
   [ g] 这样用于在屏幕上打印你输入字符信息的键盘软中断便没有机会运行,也就是看上去没有响应;
就是tasklet啦:tasklet_schedule(&keyboard_tasklet);

虽然有可能打印,因为tasklet和rx softirq被ksoftirqd[cpu]线程来执行,
///如果cpu不同,即cpu(ksoftirqd for tasklet) != cpu(ksoftirqd for rx), 屏幕一定被打印。
虽然RX_SOFTIRQ 和 TASKLET_SOFTIRQ分享ksoftirqd[cpu],
由于RX_SOFTIRQ < TASKLET_SOFTIRQ,  ///设计预留的缺陷??
TASKLET_SOFTIRQ实际被合法屏蔽,导致屏幕不被打印。

fortunately, in linux-2.6.24.4-rt4,
RX_SOFTIRQ 和 TASKLET_SOFTIRQ在同一个cpu上被不同线程执行,即分享cpu,
希望键盘操作流畅如水。

  1. Index: linux-2.6.24.4-rt4/kernel/softirq.c
  2. ===================================================================
  3. --- linux-2.6.24.4-rt4.orig/kernel/softirq.c        2008-03-24 19:05:22.000000000 -0400
  4. +++ linux-2.6.24.4-rt4/kernel/softirq.c        2008-03-24 19:07:14.000000000 -0400
  5. @@ -4,15 +4,23 @@
  6.   *        Copyright (C) 1992 Linus Torvalds
  7.   *
  8.   * Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903)
  9. + *
  10. + *        Softirq-split implemetation by
  11. + *        Copyright (C) 2005 Thomas Gleixner, Ingo Molnar
  12.   */

  13. #include <linux/module.h>
  14. +#include <linux/kallsyms.h>
  15. +#include <linux/syscalls.h>
  16. +#include <linux/wait.h>
  17. #include <linux/kernel_stat.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/init.h>
  20. +#include <linux/delay.h>
  21. #include <linux/mm.h>
  22. #include <linux/notifier.h>
  23. #include <linux/percpu.h>
  24. +#include <linux/delay.h>
  25. #include <linux/cpu.h>
  26. #include <linux/freezer.h>
  27. #include <linux/kthread.h>
  28. @@ -46,7 +54,41 @@ EXPORT_SYMBOL(irq_stat);

  29. static struct softirq_action softirq_vec[32] __cacheline_aligned_in_smp;

  30. -static DEFINE_PER_CPU(struct task_struct *, ksoftirqd);
  31. +struct softirqdata {
  32. +        int                        nr;
  33. +        unsigned long                cpu;
  34. +        struct task_struct        *tsk;
  35. +#ifdef CONFIG_PREEMPT_SOFTIRQS
  36. +        wait_queue_head_t        wait;
  37. +        int                        running;
  38. +#endif
  39. +};
  40. +
  41. +static DEFINE_PER_CPU(struct softirqdata [MAX_SOFTIRQ], ksoftirqd);
复制代码

[ 本帖最后由 sisi8408 于 2008-5-10 15:35 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-05-10 16:02 |只看该作者
原帖由 sisi8408 于 2008-5-10 15:25 发表


虽然有可能打印,因为tasklet和rx softirq被ksoftirqd[cpu]线程来执行,
///如果cpu不同,即cpu(ksoftirqd for tasklet) != cpu(ksoftirqd for rx), 屏幕一定被打印。
虽然RX_SOFTIRQ 和 TASKLET_SOFTIRQ ...

LZ的机器是UP的

>>由于RX_SOFTIRQ < TASKLET_SOFTIRQ,  ///设计预留的缺陷??
不是设计缺陷,是本身就分优先级。softirq有32个,但只用了3个,是因为目前只有这3个是地位重要或性能关键的。键盘中断不属于此类,所以用tasklet

论坛徽章:
0
18 [报告]
发表于 2008-05-10 16:08 |只看该作者
原帖由 sisi8408 于 2008-5-10 15:25 发表


虽然有可能打印,因为tasklet和rx softirq被ksoftirqd[cpu]线程来执行,
///如果cpu不同,即cpu(ksoftirqd for tasklet) != cpu(ksoftirqd for rx), 屏幕一定被打印。
虽然RX_SOFTIRQ 和 TASKLET_SOFTIRQ ...



为什么说tasklet或rx softirq被ksoftirqd执行?这个不一定吧,一次raise的软中断数超过MAX_SOFTIRQ_RESTART才会唤醒ksoftirqd去执行软中断。

[ 本帖最后由 dengcainiao 于 2008-5-10 16:13 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2008-05-10 16:15 |只看该作者
原帖由 zx_wing 于 2008-5-10 16:02 发表

LZ的机器是UP的

>>由于RX_SOFTIRQ < TASKLET_SOFTIRQ,  ///设计预留的缺陷??
不是设计缺陷,是本身就分优先级。softirq有32个,但只用了3个,是因为目前只有这3个是地位重要或性能关键的。键盘中断不属 ...


不止3个吧
SCSI
网卡
高优先级tasklet
tasklet
这就4个了,印象里是6个~~:)

查到了:
enum
{
        HI_SOFTIRQ=0,
        TIMER_SOFTIRQ,
        NET_TX_SOFTIRQ,
        NET_RX_SOFTIRQ,
        SCSI_SOFTIRQ,
        TASKLET_SOFTIRQ
};

[ 本帖最后由 dengcainiao 于 2008-5-10 16:17 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2008-05-10 17:03 |只看该作者
原帖由 dengcainiao 于 2008-5-10 16:15 发表


不止3个吧
SCSI
网卡
高优先级tasklet
tasklet
这就4个了,印象里是6个~~:)

查到了:
enum
{
        HI_SOFTIRQ=0,
        TIMER_SOFTIRQ,
        NET_TX_SOFTIRQ,
        NET_RX_SOFTIRQ,
        SCSI_SOFTIRQ,
        TASKL ...

准确。
我就只记了时钟、网络、SCSI
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP