diff options
| -rw-r--r-- | net/core/skbuff.c | 23 |
1 files changed, 6 insertions, 17 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index c16615bfb61e..32e31c299631 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -552,20 +552,13 @@ static void kfree_skbmem(struct sk_buff *skb) | |||
| 552 | case SKB_FCLONE_CLONE: | 552 | case SKB_FCLONE_CLONE: |
| 553 | fclones = container_of(skb, struct sk_buff_fclones, skb2); | 553 | fclones = container_of(skb, struct sk_buff_fclones, skb2); |
| 554 | 554 | ||
| 555 | /* Warning : We must perform the atomic_dec_and_test() before | 555 | /* The clone portion is available for |
| 556 | * setting skb->fclone back to SKB_FCLONE_FREE, otherwise | 556 | * fast-cloning again. |
| 557 | * skb_clone() could set clone_ref to 2 before our decrement. | ||
| 558 | * Anyway, if we are going to free the structure, no need to | ||
| 559 | * rewrite skb->fclone. | ||
| 560 | */ | 557 | */ |
| 561 | if (atomic_dec_and_test(&fclones->fclone_ref)) { | 558 | skb->fclone = SKB_FCLONE_FREE; |
| 559 | |||
| 560 | if (atomic_dec_and_test(&fclones->fclone_ref)) | ||
| 562 | kmem_cache_free(skbuff_fclone_cache, fclones); | 561 | kmem_cache_free(skbuff_fclone_cache, fclones); |
| 563 | } else { | ||
| 564 | /* The clone portion is available for | ||
| 565 | * fast-cloning again. | ||
| 566 | */ | ||
| 567 | skb->fclone = SKB_FCLONE_FREE; | ||
| 568 | } | ||
| 569 | break; | 562 | break; |
| 570 | } | 563 | } |
| 571 | } | 564 | } |
| @@ -887,11 +880,7 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask) | |||
| 887 | if (skb->fclone == SKB_FCLONE_ORIG && | 880 | if (skb->fclone == SKB_FCLONE_ORIG && |
| 888 | n->fclone == SKB_FCLONE_FREE) { | 881 | n->fclone == SKB_FCLONE_FREE) { |
| 889 | n->fclone = SKB_FCLONE_CLONE; | 882 | n->fclone = SKB_FCLONE_CLONE; |
| 890 | /* As our fastclone was free, clone_ref must be 1 at this point. | 883 | atomic_inc(&fclones->fclone_ref); |
| 891 | * We could use atomic_inc() here, but it is faster | ||
| 892 | * to set the final value. | ||
| 893 | */ | ||
| 894 | atomic_set(&fclones->fclone_ref, 2); | ||
| 895 | } else { | 884 | } else { |
| 896 | if (skb_pfmemalloc(skb)) | 885 | if (skb_pfmemalloc(skb)) |
| 897 | gfp_mask |= __GFP_MEMALLOC; | 886 | gfp_mask |= __GFP_MEMALLOC; |
