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

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

irq 29: nobody cared (try booting with the "irqpoll" option)
[] (dump_stack+0x0/0x14) from [] (__report_bad_irq+0x7c/0xac)
[] (__report_bad_irq+0x0/0xac) from [] (note_interrupt+0x244/0x28c)
 r4:00000000
[] (note_interrupt+0x0/0x28c) from [] (handle_level_irq+0xf0/0x110)
[] (handle_level_irq+0x0/0x110) from [] (asm_do_IRQ+0x48/0x60)
 r5:c0316b50 r4:c02e9880
[] (asm_do_IRQ+0x0/0x60) from [] (__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
[] (__do_softirq+0x0/0xd0) from [] (irq_exit+0x44/0x4c)
[] (irq_exit+0x0/0x4c) from [] (asm_do_IRQ+0x4c/0x60)
[] (asm_do_IRQ+0x0/0x60) from [] (__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
[] (setup_irq+0x0/0x1c8) from [] (request_irq+0x9c/0xcc)
 r8:00000080 r7:c015bf6c r6:00000000 r5:0000001d r4:c45c3620
[] (request_irq+0x0/0xcc) from [] (e1000_open+0xa4/0x198)
[] (e1000_open+0x0/0x198) from [] (dev_open+0xc8/0xd4)
 r5:00000000 r4:c4425000
[] (dev_open+0x0/0xd4) from [] (dev_change_flags+0x98/0x1a4)
 r5:00001043 r4:c4425000
[] (dev_change_flags+0x0/0x1a4) from [] (devinet_ioctl+0x63c/0x738)
 r7:c458b4e0 r6:c45de000 r5:beb05d8c r4:00000000
[] (devinet_ioctl+0x0/0x738) from [] (inet_ioctl+0x1b8/0x1e0)
[] (inet_ioctl+0x0/0x1e0) from [] (sock_ioctl+0x190/0x284)
[] (sock_ioctl+0x0/0x284) from [] (do_ioctl+0x70/0x8c)
 r8:c0021fc4 r7:00000036 r6:ffffffe7 r5:beb05d8c r4:00008914
[] (do_ioctl+0x0/0x8c) from [] (vfs_ioctl+0x94/0x2b0)
 r6:00000000 r5:beb05d8c r4:c45910e0
[] (vfs_ioctl+0x0/0x2b0) from [] (sys_ioctl+0x40/0x64)
 r6:00008914 r5:fffffff7 r4:c45910e0
[] (sys_ioctl+0x0/0x64) from [] (ret_fast_syscall+0x0/0x2c)
 r6:beb05e74 r5:000dcf10 r4:beb05d8c
handlers:
[] (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控制器有问题,中断不能自动清除,添加清除函数后正常。

你可能感兴趣的:(linux,驱动)