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性能消耗较大。