免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3027 | 回复: 2
打印 上一主题 下一主题

[内核模块] skb_copy_expand函数问题skb_copy_expand(skb,0,40, GFP_ATOMIC)tailroom(skb)!=40 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-01 20:06 |只看该作者 |倒序浏览
我在tcp_v4_rcv()函数中 写了如下代码,来验证skb_copy_expand函数的功能

printk("tcp_v4_rcv   skb_tailroom(skb)=%d  skb->end-skb->tail=%d\n", skb_tailroom(skb),skb->end-skb->tail);
mouskb=skb_copy_expand(skb,0,40, GFP_ATOMIC);       
if(mouskb!=NULL)
{
printk(KERN_INFO "tcp_v4_rcv mouskb=skb_copy(skb, GFP_ATOMIC) success mouskb->len=%d\n",mouskb->len);
moudata=mouskb->data;
moutail=mouskb->tail;
printk("tcp_v4_rcv moutail-moudata=%d mouskb->tail-mouskb->data=%d mouskb->end-mouskb->tail=%d\n", moutail-moudata,mouskb->tail-mouskb->data,mouskb->end-mouskb->tail);
kfree_skb(mouskb);
}


安到了说 mouskb->end-mouskb->tail的长度应该是40 怎么我在日志里面不是这样的呢
Dec  1 17:01:03 ubuntu kernel: [  286.450223] tcp_v4_rcv   skb_tailroom(skb)=6  skb->end-skb->tail=6
Dec  1 17:01:03 ubuntu kernel: [  286.450229] tcp_v4_rcv mouskb=skb_copy(skb, GFP_ATOMIC) success mouskb->len=24
Dec  1 17:01:03 ubuntu kernel: [  286.450232] tcp_v4_rcv moutail-moudata=24 mouskb->tail-mouskb->data=24 mouskb->end-mouskb->tail=40
7:01:03 ubuntu kernel: [  286.450820] tcp_v4_rcv   skb_tailroom(skb)=10  skb->end-skb->tail=10
Dec  1 17:01:03 ubuntu kernel: [  286.450950] tcp_v4_rcv mouskb=skb_copy(skb, GFP_ATOMIC) success mouskb->len=20
Dec  1 17:01:03 ubuntu kernel: [  286.450954] tcp_v4_rcv moutail-moudata=20 mouskb->tail-mouskb->data=20 mouskb->end-mouskb->tail=44
7:01:03 ubuntu kernel: [  286.647478] tcp_v4_rcv   skb_tailroom(skb)=278  skb->end-skb->tail=278
Dec  1 17:01:03 ubuntu kernel: [  286.647484] tcp_v4_rcv mouskb=skb_copy(skb, GFP_ATOMIC) success mouskb->len=1288
Dec  1 17:01:03 ubuntu kernel: [  286.647487] tcp_v4_rcv moutail-moudata=1288 mouskb->tail-mouskb->data=1288 mouskb->end-mouskb->tail=56

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2012-12-03 09:34 |只看该作者
回复 1# SCDXMOE
建议你把mouskb->len打印一下就知道为什么了。

skb_copy_expand会调用__alloc_skb分配skb,但是内核为了提供缓存读取的效率,对分配skb的大小进行了缓存对齐(L1_CACHE_BYTES=32字节 x86架构),
所有skb_copy_expand实际的大小要大于oldskb->len+40,所有mouskb->end-mouskb->tail 要大于等于 40字节。

   

论坛徽章:
0
3 [报告]
发表于 2012-12-03 14:41 |只看该作者
首先感谢 瀚海书香 的回复
我打印了mouskb->len 在上面有数据 和skb->len长度是一样的

您说的有道理 由于缓存对齐
我要求的是tail_room空间大于=40就行了
再次谢谢您的时间


回复 2# 瀚海书香


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP