这里有两个cache,skbuff_fclone_cache和skbuff_head_cache。它们两个的区别是前者是每两个skb为一组。当从skbuff_fclone_cache分配skb时,会两个连续的skb一起分配,但是释放的时候可以分别释放。也就是说当调用者知道需要两个skb时,如后面的操作很可能使用skb_clone时,那么从skbuff_fclone_cache上分配skb会更高效一些。
LINUX 中 SKB 的分配最终是由函数 : struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,int fclone) 来完成. SKB 可以分为 SKB 描述符与 SKB 数据区两个部分,其中描述符必须从 CACHE 中来分配 : 或者从skbuff_fclone_cache 中分配,或者从 skbuff_head_cache 中来分配. 如果从分配描述符...
1/**2* __alloc_skb - allocate a network buffer3* @size: size to allocate4* @gfp_mask: allocation mask5* @flags: If SKB_ALLOC_FCLONE is set, allocate from fclone cache6* instead of head cache and allocate a cloned (child) skb.7* If SKB_ALLOC_RX is set, __GFP_MEMALLOC will ...
@fclone: 从fclone缓存分配内存并分配一个克隆的skb * @node: 分配的节点号,一般为-1 ***/ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, int fclone, int node) { struct kmem_cache *cache; struct skb_shared_info *shinfo; struct sk_buff *skb; u8 *data; cache = fclon...
skb= alloc_skb_fclone(size + sk->sk_prot->max_header, gfp);if(likely(skb)) {boolmem_scheduled;if(force_schedule) { mem_scheduled=true; sk_forced_mem_schedule(sk, skb->truesize); }else{ mem_scheduled= sk_wmem_schedule(sk, skb->truesize); ...
1/**2* __alloc_skb - allocate a network buffer3* @size: size to allocate4* @gfp_mask: allocation mask5* @flags: If SKB_ALLOC_FCLONE is set, allocate from fclone cache6* instead of head cache and allocate a cloned (child) skb.7* If SKB_ALLOC_RX is set, __GFP_MEMALLOC will ...