|
发表于 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了,你可以下载下来看看,那个应该好理解点 |
|