- 论坛徽章:
- 3
|
回复 1# humjb_1983
1. 发现了一点线索,中断178在panic之前发生了一次irq migratioin, 这也许跟panic有点关系。从打印信息能看到:
move_irq = 1,
pending_mask = {
bits = {32768, 0, 0, 0}
},
affinity = {
bits = {256, 0, 0, 0}
},
因为irq_desc数组是全局数组不是SLAB, 这几个值应该比较可信, 这块内存被写坏的可能性不大
affinity是原来的值, pending_mask是将要迁移的目的值,
这说明从"上次178号中断执行完之后到本次178号开始执行并Crash"这段时间里发生了一次 irq migratioin
从linux 2.6.18 + X86_64内核代码看, 只有一个内核路径可能会执行irq migratioin,
那就是:"用户空间写/proc/irq/178/smp_affinity" -> irq_affinity_write_proc -> proc_set_irq_affinity -> set_pending_irq
set_pending_irq会发起一次irq migratioin, 这仅仅是开始,
当__do_IRQ执行完中断处理函数之后,会调用desc->chip->end(irq)来终止本次irq migratioin
desc->chip->end 会调用move_native_irq执行真正的迁移并结束迁移,同时清空desc->move_irq = 0;
这也能说明irq migratioin 是从上次178号中断执行完之后才开始的,
不过从代码来看, irq migratioin执行的过程中没有发现明显的可能写坏irqaction->next的地方。
下一步我感觉也许可以手动修改/proc/irq/178/smp_affinity, 尝试重现一下
2. 因为irqaction的内存是从slab分配的,这就是个内存池,如果别人写坏了内存一样可能把irqaction给写坏。如果crash的现场跟写坏的地方里的很远那就不好定位了。
有个疑问就是178中断的irqaction->handler字段为什么没有显示出来函数名而是直接显示了一个地址0xffffffff8827628b?这个字段也有可能被写坏了?
可以看看这个地址0xffffffff8827628b是不是指向正确的中断函数。
这可能需要加载网卡驱动的符号表。 |
|