免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4715 | 回复: 5
打印 上一主题 下一主题

[中断] 在中断上下文中调用disable_irq引发的cpu挂死 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-30 21:18 |只看该作者 |倒序浏览
现象描述:
近期在调试一款powerpc的85xx的cpu的时候(2.6.32),遇到一个很诡异的问题。
我们的所有中断都是在内核简单处理,然后wake up应用态的一个线程来进行后续的终端数据的处理。等于把底半处理退后到应用态。在其他的内核版本中都无问题,例如2.6.21,2.6.22。但是当移植到2.6.32内核的时候。
内核态的irq isr在内核里简单的调用disable_irq来关闭一下这个中断,然后应用态的线程后续处理,这时问题了。后续定位发现在中断上下文中不能调用disable_irq,一调用整个内核就挂死了,不再相应任何事情。

解决:
调用disable_irq_nosync就不会出问题。
后来就比对了一下2.6.21和2.6.32内核在disable_irq上的实现细节,发现2.6.32对disable_irq的实现做了比较到的改动。

解惑:请各位达人解惑。

论坛徽章:
1
水瓶座
日期:2013-09-28 21:40:25
2 [报告]
发表于 2012-07-01 14:56 |只看该作者
内核挂死?是panic了么?如果是panic给点详细的系统打印信息。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:51:16
3 [报告]
发表于 2012-07-02 15:39 |只看该作者
分析下disable_irq_nosync和disable_irq的代码就知道了啊,disable_irq会调用synchronize_irq函数等待中断返回, 所以在中断处理程序中不能使用disable_irq, 否则会导致cpu被synchronize_irq独占而发生系统崩溃。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
4 [报告]
发表于 2012-07-02 20:16 |只看该作者
多cpu系统还是单cpu系统?

论坛徽章:
0
5 [报告]
发表于 2012-07-02 23:15 |只看该作者
回复 1# hanhai118

在实现细节上的改动不是很大啊?求解,谢谢

linux-2.6.21: /kernel/irq/manager.c
void disable_irq(unsigned int irq)
{
        struct irq_desc *desc = irq_desc + irq;

        if (irq >= NR_IRQS)
                return;

        disable_irq_nosync(irq);
        if (desc->action)
                synchronize_irq(irq);
}

linux-2.6.32: kernel/irq/manager.c
void disable_irq(unsigned int irq)
{
        struct irq_desc *desc = irq_to_desc(irq);

        if (!desc)
                return;

        disable_irq_nosync(irq);
        if (desc->action)
                synchronize_irq(irq);
}

论坛徽章:
0
6 [报告]
发表于 2012-07-05 21:15 |只看该作者
回复 5# knight8267

还是有点区别的。
你看看2.6.32的代码。
synchronize_irq(irq);
这个函数的定义在2.6.21内核是用smp宏控制的,而在2.6.32的内核没有用smp宏控制。
所以再2.6.21内核中如果是单核cpu就没有问题,而2.6.32内核,即使是单核的也会出问题。
这些是些细微的差别。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP