irq 29: nobody cared (try booting with the "irqpoll" option) 问题说明

当调试一块网卡的时候,内核报错,打印信息如下:

irq 29: nobody cared (try booting with the "irqpoll" option)
[<c0025ab8>] (dump_stack+0x0/0x14) from [<c005db58>] (__report_bad_irq+0x7c/0xac)
[<c005dadc>] (__report_bad_irq+0x0/0xac) from [<c005ddcc>] (note_interrupt+0x244/0x28c)
 r4:00000000
[<c005db88>] (note_interrupt+0x0/0x28c) from [<c005e720>] (handle_level_irq+0xf0/0x110)
[<c005e630>] (handle_level_irq+0x0/0x110) from [<c0021048>] (asm_do_IRQ+0x48/0x60)
 r5:c0316b50 r4:c02e9880
[<c0021000>] (asm_do_IRQ+0x0/0x60) from [<c0021a84>] (__irq_svc+0x24/0x80)
Exception stack(0xc45dfd18 to 0xc45dfd60)
fd00:                                                       0000001d c45de000 
fd20: c45de000 00000000 00000022 c0316b50 00000000 40000013 0000000a c4425000 
fd40: c030b360 c45dfd84 c45dfd88 c45dfd60 c003d3a0 c003d130 20000113 ffffffff 
 r6:20000000 r5:fe170000 r4:ffffffff
[<c003d0f8>] (__do_softirq+0x0/0xd0) from [<c003d3a0>] (irq_exit+0x44/0x4c)
[<c003d35c>] (irq_exit+0x0/0x4c) from [<c002104c>] (asm_do_IRQ+0x4c/0x60)
[<c0021000>] (asm_do_IRQ+0x0/0x60) from [<c0021a84>] (__irq_svc+0x24/0x80)
Exception stack(0xc45dfdb8 to 0xc45dfe00)
fda0:                                                       00000000 c02e4960 
fdc0: 20000000 00000000 c45c3620 c02e9880 0000001d 40000013 00000000 c4425000 
fde0: c4425000 c45dfe20 c45dfddc c45dfe00 c005e3c0 c005d7ec a0000013 ffffffff 
 r6:20000000 r5:fe170000 r4:ffffffff
[<c005d720>] (setup_irq+0x0/0x1c8) from [<c005daac>] (request_irq+0x9c/0xcc)
 r8:00000080 r7:c015bf6c r6:00000000 r5:0000001d r4:c45c3620
[<c005da10>] (request_irq+0x0/0xcc) from [<c015fc5c>] (e1000_open+0xa4/0x198)
[<c015fbb8>] (e1000_open+0x0/0x198) from [<c01e27e4>] (dev_open+0xc8/0xd4)
 r5:00000000 r4:c4425000
[<c01e271c>] (dev_open+0x0/0xd4) from [<c01e2ca0>] (dev_change_flags+0x98/0x1a4)
 r5:00001043 r4:c4425000
[<c01e2c08>] (dev_change_flags+0x0/0x1a4) from [<c02226dc>] (devinet_ioctl+0x63c/0x738)
 r7:c458b4e0 r6:c45de000 r5:beb05d8c r4:00000000
[<c02220a0>] (devinet_ioctl+0x0/0x738) from [<c0224528>] (inet_ioctl+0x1b8/0x1e0)
[<c0224370>] (inet_ioctl+0x0/0x1e0) from [<c01d52c0>] (sock_ioctl+0x190/0x284)
[<c01d5130>] (sock_ioctl+0x0/0x284) from [<c008c40c>] (do_ioctl+0x70/0x8c)
 r8:c0021fc4 r7:00000036 r6:ffffffe7 r5:beb05d8c r4:00008914
[<c008c39c>] (do_ioctl+0x0/0x8c) from [<c008c4bc>] (vfs_ioctl+0x94/0x2b0)
 r6:00000000 r5:beb05d8c r4:c45910e0
[<c008c428>] (vfs_ioctl+0x0/0x2b0) from [<c008c718>] (sys_ioctl+0x40/0x64)
 r6:00008914 r5:fffffff7 r4:c45910e0
[<c008c6d8>] (sys_ioctl+0x0/0x64) from [<c0021e20>] (ret_fast_syscall+0x0/0x2c)
 r6:beb05e74 r5:000dcf10 r4:beb05d8c
handlers:
[<c015bf6c>] (e1000_intr+0x0/0x164)
Disabling IRQ #29

看第一行打印信息得知,IRQ29中断没有处理,但从报错的倒数第二行看到“e1000_intr”函数,该函数是网卡驱动的中断处理函数,

到这,你可能就会产生疑问了,明明网卡中断处理函数正常调用了,但是为什么内核说该中断没有得到处理呢?这就涉及到共享中断

的处理过程了。询问徐老师后得知,当一个中断号上有多个中断共享的时候,该中断来的时候,内核会依次调用共享该中断号的各个中断处理函数,如果

中断处理函数检测到该中断不是自己的中断时就会返回IRQ_NONE,这时内核就会调用下一个中断处理函数,而这些中断处理函数中必

须至少有一个返回IRQ_HANDLED告知内核该中断是自己的中断,已经正常处理,若内核依次调用完所有该中断号的中断处理函数仍

未得到IRQ_HANDLED的返回值,内核就会报告上述错误,并在该中断出现一定次数后关闭该中断。


即只有中断处理函数返回 IRQ_HANDLED ,这个中断才是被正确完成的的

针对上述问题,很可能填错了中断号。这个29号中断是由其他原因引起的。
在e1000网卡驱动的中断处理函数中,检查了网卡的中断状态寄存器,发现并没有中断,所以不会返回IRQ_HANDLED ,
而是返回IRQ_NONE 。内核发现执行完29号中断上注册的全部中断处理函数,都得不到一个IRQ_HANDLED 返回,就
会报irq 29: nobody cared 这样的错。
而实际检查后发现网卡中断号没有问题,那就有可能时网卡没有中断,但是该中断管脚一直报假中断,实际检测后发现,
果然当网卡启动后中断管脚一直处于拉低状态,这就解释为什么中断号正确但是确保中断未处理的错误了。
最后检测发现是所用的板卡的PCI控制器有问题,中断不能自动清除,添加清除函数后正常。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值