USB拔插导致内核deadlock

mutourenzhang 2011-10-20 10:11:16
最近在产品上增加对USB无线网卡支持(ar9170芯片),在做健壮性测试时发现反复拔插USB不到10次(随机)会导致内核(2.6.31)死锁,而且出现死锁的地方也是不固定的。但是在接上USB采用手动insmod和rmmod驱动时,并不会出现死锁现象,驱动采用的是标准内核自带驱动,不知道哪位同仁能指点指点,谢谢!
...全文
151 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andiry 2011-10-21
  • 打赏
  • 举报
回复
rmmod会保证正常的卸载顺序,等待传输完成,释放资源,等等。直接拔插可能会在执行中数据错误,如果没有正确的recover机制的话可能会出问题。死锁出现在什么函数里?
mutourenzhang 2011-10-21
  • 打赏
  • 举报
回复
在2.6.37上试过,也有这种问题(反复拔插几次内核就没反应了 估计是死锁),关键是如果驱动有问题,rmmod也是调用的和拔掉网卡相同的disconnect函数,为什么就没问题呢?实在想不明白,望指点!
Andiry 2011-10-21
  • 打赏
  • 举报
回复
31太旧了,最新的内核有这问题吗?
Andiry 2011-10-21
  • 打赏
  • 举报
回复
看起来没啥问题,我也不知道。。
mutourenzhang 2011-10-21
  • 打赏
  • 举报
回复
自带驱动disconnect函数中最先掉用的就是ieee80211_unregister_hw这个函数,没有很特殊的卸载操作
static void ar9170_usb_disconnect(struct usb_interface *intf)
{
struct ar9170_usb *aru = usb_get_intfdata(intf);

if (!aru)
return;

aru->common.state = AR9170_IDLE;
ar9170_unregister(&aru->common);
ar9170_usb_cancel_urbs(aru);

release_firmware(aru->init_values);
release_firmware(aru->firmware);

usb_put_dev(aru->udev);
usb_set_intfdata(intf, NULL);
ieee80211_free_hw(aru->common.hw);
}
Andiry 2011-10-21
  • 打赏
  • 举报
回复
别的无线网卡没问题说明可能是具体的驱动问题,跟协议层无关,你的无线网卡卸载函数中有什么特殊操作吗?对硬件的操作,资源释放等等
mutourenzhang 2011-10-21
  • 打赏
  • 举报
回复
rmmod和热拔插都是调用驱动相同的disconnect卸载函数,按道理说资源释放流程也是一样的。
mutourenzhang 2011-10-21
  • 打赏
  • 举报
回复
死在内核80211协议栈卸载函数ieee80211_unregister_hw中,但是死锁具体位置是不固定的!开始我也怀疑是由于内核协议栈有问题,不过我手上还有一款其他芯片(RT73)的无线网卡,随便怎么拔插,都不会出现这个问题。很是不解。。

4,469

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧