实现功能:

使用自己已经分配的内存让skb->data指向,而不是使用alloc_malloc()。

部分代码如下:

             /*
* build a new sk_buff
*/
//struct sk_buff *send_skb = kmem_cache_alloc_node(skbuff_head_cache, GFP_ATOMIC & ~__GFP_DMA, NUMA_NO_NODE);
struct sk_buff *send_skb = kmem_cache_alloc(skbuff_head_cache, GFP_ATOMIC & ~__GFP_DMA); if (!send_skb) {
//spin_unlock(&lock);
return NF_DROP;
} //printk("what2\n");
memset(send_skb, , offsetof(struct sk_buff, tail));
atomic_set(&send_skb->users, );
send_skb->cloned = ; send_skb->head = mmap_buf + ;
send_skb->data = mmap_buf + ;

第18行,mmap_buf是提前分配的内存。

在/var/log/messages中网卡驱动会输出错误信息:

 ep  :: 10g-host2 kernel: ixgbe ::00.0: eth2: Detected Tx Unit Hang
Sep :: 10g-host2 kernel: Tx Queue <>
Sep :: 10g-host2 kernel: TDH, TDT <>, <1ea>
Sep :: 10g-host2 kernel: next_to_use <1ea>
Sep :: 10g-host2 kernel: next_to_clean <>
Sep :: 10g-host2 kernel: ixgbe ::00.0: eth2: Detected Tx Unit Hang
Sep :: 10g-host2 kernel: Tx Queue <>
Sep :: 10g-host2 kernel: TDH, TDT <>, <1eb>
Sep :: 10g-host2 kernel: next_to_use <1eb>
Sep :: 10g-host2 kernel: next_to_clean <>
Sep :: 10g-host2 kernel: ixgbe ::00.0: eth2: Detected Tx Unit Hang
Sep :: 10g-host2 kernel: Tx Queue <>
Sep :: 10g-host2 kernel: TDH, TDT <>, <1ea>
Sep :: 10g-host2 kernel: next_to_use <1ea>
Sep :: 10g-host2 kernel: next_to_clean <>
Sep :: 10g-host2 kernel: ixgbe ::00.0: eth2: Detected Tx Unit Hang
Sep :: 10g-host2 kernel: Tx Queue <>
Sep :: 10g-host2 kernel: TDH, TDT <>, <1ea>
Sep :: 10g-host2 kernel: next_to_use <1ea>
Sep :: 10g-host2 kernel: next_to_clean <>
Sep :: 10g-host2 kernel: ixgbe ::00.0: eth2: Detected Tx Unit Hang
Sep :: 10g-host2 kernel: Tx Queue <>
Sep :: 10g-host2 kernel: TDH, TDT <>, <1ef>
Sep :: 10g-host2 kernel: next_to_use <1ef>
Sep :: 10g-host2 kernel: next_to_clean <>
Sep :: 10g-host2 kernel: ixgbe ::00.0: eth2: Detected Tx Unit Hang
Sep :: 10g-host2 kernel: Tx Queue <>
Sep :: 10g-host2 kernel: TDH, TDT <>, <1ec>
Sep :: 10g-host2 kernel: next_to_use <1ec>
Sep :: 10g-host2 kernel: next_to_clean <>
Sep :: 10g-host2 kernel: ixgbe ::00.0: eth2: Detected Tx Unit Hang

在排除各种原因后,定位为分配的mmap_buf存在问题。使用vmalloc()分配不正确,改为kmalloc()后正常。

《Linux内核设计与实现》第12.5节有解释,应该是:网卡设备要求分配的物理地址连续,而vmalloc()只是虚拟地址连续

最新文章

  1. 19.Java 注解
  2. Android音频开发之MediaRecorder/MediaPlayer
  3. [Leetcode] Course Schedule
  4. LUA table学习笔记
  5. 十天学会DIV+CSS(DIV布局)
  6. swiper初步探索
  7. PHP反射获取类中的所有常量
  8. jQueryMobile控件之复选框
  9. jQuery Mobile_页面事件
  10. (转)颜色渐变CSS
  11. 第二百一十七天 how can I 坚持
  12. ThinkSNS插件的使用方法
  13. 【JTA】JTA允许应用程序执行分布式事务处理
  14. POJ 2553 The Bottom of a Graph TarJan算法题解
  15. JavaScriptOOP
  16. POJ2396 Budget [有源汇上下界可行流]
  17. C# -- 内插字符串的使用
  18. imageLoader之介绍
  19. WPF c# 定时器
  20. .net MVC入门

热门文章

  1. 知问前端——对话框UI(二)
  2. Flash Builder 4.7 完美破解
  3. BeeFramework 系列
  4. 颜色混合opengl--glBlendFunc函数
  5. VS2013 更改MFC标题栏图标和生成的执行文件图标
  6. UVA 10359 Tiling
  7. JS打印——第三方控件打印
  8. ios 最新系统bug与解决——微信公众号中弹出键盘再收起时,原虚拟键盘位点击事件无效
  9. python--控制窗体
  10. js-限制参与活动的范围(微信H5活动)