免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: humjb_1983
打印 上一主题 下一主题

[中断] 空指针in handle_IRQ_event [复制链接]

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
11 [报告]
发表于 2015-01-13 17:27 |只看该作者
回复 9# humjb_1983


    是的,dev_id的偏移值正好是0x38

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
12 [报告]
发表于 2015-01-13 17:30 |只看该作者
回复 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是不是指向正确的中断函数。
这可能需要加载网卡驱动的符号表。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
13 [报告]
发表于 2015-01-14 14:38 |只看该作者
gaojl0728 发表于 2015-01-13 17:30
回复 1# humjb_1983

首先,需要再次感谢兄弟的热情。
1、irq迁移的问题,可能是irqbalance服务做的,确实没有直接操作next指针的地方,该指针看似只有在request_irq时才会操作,然后就不会再动了。
    感觉irq迁移导致问题的可能性不大。
2、irqaction中的handler解析了一下:
crash> sym ffffffff8827628b
ffffffff8827628b (t) igb_msix_rx  
应该是正常的,在igb驱动中注册的处理函数,只是没有自动解析成符号。

目前看irqaction结构体中next指针的前后数据应该都是正常的,应该不会是内存越界导致的。

谢谢!

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
14 [报告]
发表于 2015-01-14 22:22 |只看该作者
回复 1# humjb_1983


不好意思,这么久才回你。看了一下你的blog的分析过程,我也是比较认同的结论的。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
15 [报告]
发表于 2015-01-15 08:36 |只看该作者
Tinnal 发表于 2015-01-14 22:22
回复 1# humjb_1983

呵呵,年底忙,感谢兄弟!

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
16 [报告]
发表于 2015-01-15 16:19 |只看该作者
回复 13# humjb_1983


    我大概找到Crash的原因了, 你想知道吗

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
17 [报告]
发表于 2015-01-15 16:30 |只看该作者
回复 13# humjb_1983


    一不留神看错代码了, 请忽略我前面的留言。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
18 [报告]
发表于 2015-01-15 18:15 |只看该作者
大致看了一下,感觉也是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
}

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
19 [报告]
发表于 2015-01-15 18:38 |只看该作者
super皮波 发表于 2015-01-15 18:15
大致看了一下,感觉也是1bit跳变
因为struct irqaction这个结构体,只有在共享中断号的情况下next的成员才 ...

呵呵,我也是这么想的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP