|
@@ -181,12 +181,14 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
|
|
skb = kmem_cache_alloc_node(cache, gfp_mask & ~__GFP_DMA, node);
|
|
|
if (!skb)
|
|
|
goto out;
|
|
|
+ prefetchw(skb);
|
|
|
|
|
|
size = SKB_DATA_ALIGN(size);
|
|
|
data = kmalloc_node_track_caller(size + sizeof(struct skb_shared_info),
|
|
|
gfp_mask, node);
|
|
|
if (!data)
|
|
|
goto nodata;
|
|
|
+ prefetchw(data + size);
|
|
|
|
|
|
/*
|
|
|
* Only clear those fields we need to clear, not those that we will
|
|
@@ -208,15 +210,8 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
|
|
|
|
|
|
/* make sure we initialize shinfo sequentially */
|
|
|
shinfo = skb_shinfo(skb);
|
|
|
+ memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
|
|
|
atomic_set(&shinfo->dataref, 1);
|
|
|
- shinfo->nr_frags = 0;
|
|
|
- shinfo->gso_size = 0;
|
|
|
- shinfo->gso_segs = 0;
|
|
|
- shinfo->gso_type = 0;
|
|
|
- shinfo->ip6_frag_id = 0;
|
|
|
- shinfo->tx_flags.flags = 0;
|
|
|
- skb_frag_list_init(skb);
|
|
|
- memset(&shinfo->hwtstamps, 0, sizeof(shinfo->hwtstamps));
|
|
|
|
|
|
if (fclone) {
|
|
|
struct sk_buff *child = skb + 1;
|
|
@@ -505,16 +500,10 @@ int skb_recycle_check(struct sk_buff *skb, int skb_size)
|
|
|
return 0;
|
|
|
|
|
|
skb_release_head_state(skb);
|
|
|
+
|
|
|
shinfo = skb_shinfo(skb);
|
|
|
+ memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
|
|
|
atomic_set(&shinfo->dataref, 1);
|
|
|
- shinfo->nr_frags = 0;
|
|
|
- shinfo->gso_size = 0;
|
|
|
- shinfo->gso_segs = 0;
|
|
|
- shinfo->gso_type = 0;
|
|
|
- shinfo->ip6_frag_id = 0;
|
|
|
- shinfo->tx_flags.flags = 0;
|
|
|
- skb_frag_list_init(skb);
|
|
|
- memset(&shinfo->hwtstamps, 0, sizeof(shinfo->hwtstamps));
|
|
|
|
|
|
memset(skb, 0, offsetof(struct sk_buff, tail));
|
|
|
skb->data = skb->head + NET_SKB_PAD;
|