是的,dev_id的偏移值正好是0x38 回复 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是不是指向正确的中断函数。
这可能需要加载网卡驱动的符号表。 gaojl0728 发表于 2015-01-13 17:30 static/image/common/back.gif
回复 1# humjb_1983
首先,需要再次感谢兄弟的热情。
1、irq迁移的问题,可能是irqbalance服务做的,确实没有直接操作next指针的地方,该指针看似只有在request_irq时才会操作,然后就不会再动了。
感觉irq迁移导致问题的可能性不大。
2、irqaction中的handler解析了一下:
crash> sym ffffffff8827628b
ffffffff8827628b (t) igb_msix_rx
应该是正常的,在igb驱动中注册的处理函数,只是没有自动解析成符号。
目前看irqaction结构体中next指针的前后数据应该都是正常的,应该不会是内存越界导致的。
谢谢! 回复 1# humjb_1983
不好意思,这么久才回你。看了一下你的blog的分析过程,我也是比较认同的结论的。
Tinnal 发表于 2015-01-14 22:22 static/image/common/back.gif
回复 1# humjb_1983
呵呵,年底忙,感谢兄弟! 回复 13# humjb_1983
我大概找到Crash的原因了, 你想知道吗 回复 13# humjb_1983
一不留神看错代码了, 请忽略我前面的留言。 大致看了一下,感觉也是1bit跳变
因为struct irqaction这个结构体,只有在共享中断号的情况下next的成员才是不为0的,但是如果是共享中断线的话,这个action中的flags不为0
并且这个结构体next前后没有被覆盖的迹象
crash> struct irqaction 0xffffffff803018a0
struct irqaction {
handler = 0xffffffff8006e9da <timer_interrupt>,
flags = 32,
mask = {
bits = {0, 0, 0, 0}
},
name = 0xffffffff802b3dfa "timer",
dev_id = 0x0,
next = 0x0,
irq = 0,
dir = 0x0
} super皮波 发表于 2015-01-15 18:15 static/image/common/back.gif
大致看了一下,感觉也是1bit跳变
因为struct irqaction这个结构体,只有在共享中断号的情况下next的成员才 ...
呵呵,我也是这么想的。
页:
1
[2]