LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1859|回复: 7

关于申请新的sk_buff结构的问题

[复制链接]
发表于 2005-6-15 22:03:44 | 显示全部楼层 |阅读模式
本人刚接触LINUX不久,对sk_buf结构及其链表还不明白,最近读了几天的sk_buff源代码,仍感觉一头雾水,期望高手不吝赐教,给我讲讲sk_buff结构及其链表,谢谢!!
    alloc_skb()函数是申请新的sk_buff结构,在里面有这样几行我始终不明白:
        /*Get the HEAD*/
            skb=skb_head_from_pool();
            if(skb==NULL) {
                skb=kmem_cache_alloc(akbuff_head_cache,gfp_mask & `_GFP_DMA);
            if (skb==NULL)
               goto nohead; :comp
           }
        其中在skb_head_from_pool()中又调用了_skb_dequeue(list),此函数的功能是分离并返回链表首包,我不明白这和申请新的sk_buff有什么关系?(我的内核版本是2.4.20-8)
发表于 2005-6-18 17:43:05 | 显示全部楼层
看看skb_head_to_pool和在什么地方调用了,你就明白了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-26 17:04:11 | 显示全部楼层
能否说详细点?谢谢!
回复 支持 反对

使用道具 举报

发表于 2005-7-11 13:29:46 | 显示全部楼层
skb_head_pool[NR_CPUS]就是skb head的池子,每个cpu一个struct skb_buff_head list.
当一个skb不在需要的时候,不使用kmem_cache_free释放,而是skb_head_to_poo加到当前
cpu的skb_head_pool的list上,这样下次分配skb的时候,就可以skb_head_from_pool从skb_head_pool
中取,而不用kmem_cache_alloc重新分配.int sysctl_hot_list_len=128是list的长度上限。
alloc_skb的时候先从skb_head_pool里skb_head_from_pool去sk_buff,如果没取到它返回的就是NULL,
就kmem_cache_alloc从skbuff_head_cache里分配.
skb_head_from_pool就是从skb_head_pool的list取sk_buff
skb_head_to_pool把不用的sk_buff加到skb_head_pool的list上,如果list满了就kmem_cache_free(skbuff_head_cache,skb)
在alloc_skb里面
          data=kmalloc(size+sizeof(struct skb_shared_info),gfp_mask);
           if(data==NULL)             /*数据空间分配没有成功,上面成功分配了sk_buff*/
                     goto nodata;
......
nodata:
           skb_head_to_pool(skb);       /*skb_head_pool的list没满就加到list上,以后alloc_skb时用*/

void kfree_skbmem(struct sk_buff *skb)
{
       skb_release_data(skb);              /*释放数据空间*/
       skb_head_to_pool(skb);            /*处理sk_buff,跟上面一样*/
}
http://vger.kernel.org/~davem/
davem写的skb的一些说明
你再好好看看代码吧,2.6里面没有用skb_head_pool了,你可以下载下来看看,那个应该好理解点
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-29 10:47:39 | 显示全部楼层
谢谢你的指点,我现在已经明白了。
davem写的SKB的一些说明我大致看了一下,不过
我的E文不好,每次都用金山词霸翻译,费劲!还是看
你写的爽!以后碰到问题希望能再次得到你的帮助,谢谢!
回复 支持 反对

使用道具 举报

发表于 2005-12-20 15:17:02 | 显示全部楼层
为什么2.6要把skb_head_pool去掉呢?
回复 支持 反对

使用道具 举报

发表于 2005-12-23 22:56:28 | 显示全部楼层
Per-CPU cache has added to slab layer In 2.6 series kernel.
回复 支持 反对

使用道具 举报

发表于 2006-1-3 10:58:42 | 显示全部楼层
It looks like a kind of look aside list?
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表