diff options
Diffstat (limited to 'net/core/skbuff.c')
-rw-r--r-- | net/core/skbuff.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 6e04b1fa11f2..3f0636cd76cd 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -3004,7 +3004,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) | |||
3004 | skb_shinfo(nskb)->gso_size = pinfo->gso_size; | 3004 | skb_shinfo(nskb)->gso_size = pinfo->gso_size; |
3005 | pinfo->gso_size = 0; | 3005 | pinfo->gso_size = 0; |
3006 | skb_header_release(p); | 3006 | skb_header_release(p); |
3007 | nskb->prev = p; | 3007 | NAPI_GRO_CB(nskb)->last = p; |
3008 | 3008 | ||
3009 | nskb->data_len += p->len; | 3009 | nskb->data_len += p->len; |
3010 | nskb->truesize += p->truesize; | 3010 | nskb->truesize += p->truesize; |
@@ -3030,8 +3030,8 @@ merge: | |||
3030 | 3030 | ||
3031 | __skb_pull(skb, offset); | 3031 | __skb_pull(skb, offset); |
3032 | 3032 | ||
3033 | p->prev->next = skb; | 3033 | NAPI_GRO_CB(p)->last->next = skb; |
3034 | p->prev = skb; | 3034 | NAPI_GRO_CB(p)->last = skb; |
3035 | skb_header_release(skb); | 3035 | skb_header_release(skb); |
3036 | 3036 | ||
3037 | done: | 3037 | done: |
@@ -3379,10 +3379,12 @@ EXPORT_SYMBOL(__skb_warn_lro_forwarding); | |||
3379 | 3379 | ||
3380 | void kfree_skb_partial(struct sk_buff *skb, bool head_stolen) | 3380 | void kfree_skb_partial(struct sk_buff *skb, bool head_stolen) |
3381 | { | 3381 | { |
3382 | if (head_stolen) | 3382 | if (head_stolen) { |
3383 | skb_release_head_state(skb); | ||
3383 | kmem_cache_free(skbuff_head_cache, skb); | 3384 | kmem_cache_free(skbuff_head_cache, skb); |
3384 | else | 3385 | } else { |
3385 | __kfree_skb(skb); | 3386 | __kfree_skb(skb); |
3387 | } | ||
3386 | } | 3388 | } |
3387 | EXPORT_SYMBOL(kfree_skb_partial); | 3389 | EXPORT_SYMBOL(kfree_skb_partial); |
3388 | 3390 | ||