网口导致内核挂死问题

CPU型号:MT7621

内核版本:linux-2.6.36.x

网卡驱动:raether

问题描述:

编写驱动,使用定时器每10ms接收8个外部的skb包,然后发送出去,现象就是设备运行3到4天会挂死;

加快问题出现方法:编写程序,启用500个线程同时运行,线程内部可以什么都不处理,这样设备半个小时左右就会挂死;

问题原因:

设备发包时使用的是自己组装的私有协议包,

首先使用kmem_cache_alloc申请缓存空间,然后根据skb结构填充内容,再使用dev_xmit_skb发送数据包,在发送过程中,CPU会调用函数dma_cache_sync(NULL, skb->data, skb_headlen(skb), DMA_TO_DEVICE);用于刷新缓存中的数据到DMA中,这个操作太频繁就会导致设备挂死;具体原因不知;

修改方法:

修改kmem_cache_alloc分配缓存空间函数,直接使用pci_alloc_consistent函数申请DMA空间,然后在填充skb时,直接使用skb->data = data操作,将DMA空间地址指向SKB data位置,这样就不会触发驱动去刷新DMA空间操作,后续设备没有再出现挂死现象,但是这个操作对CPU性能消耗较大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值