net: mirror skb frag ref/unref helpers
[linux-2.6-block.git] / net / core / skbuff.c
index 2554a6f5f386871da192cce6a59bb9f18a7ec1e8..ea052fa710d893a266def2686ad50868913b4fc4 100644 (file)
@@ -907,11 +907,6 @@ static void skb_clone_fraglist(struct sk_buff *skb)
                skb_get(list);
 }
 
-static bool is_pp_page(struct page *page)
-{
-       return (page->pp_magic & ~0x3UL) == PP_SIGNATURE;
-}
-
 int skb_pp_cow_data(struct page_pool *pool, struct sk_buff **pskb,
                    unsigned int headroom)
 {
@@ -1033,37 +1028,6 @@ static bool skb_pp_recycle(struct sk_buff *skb, void *data)
        return napi_pp_put_page(virt_to_page(data));
 }
 
-/**
- * skb_pp_frag_ref() - Increase fragment references of a page pool aware skb
- * @skb:       page pool aware skb
- *
- * Increase the fragment reference count (pp_ref_count) of a skb. This is
- * intended to gain fragment references only for page pool aware skbs,
- * i.e. when skb->pp_recycle is true, and not for fragments in a
- * non-pp-recycling skb. It has a fallback to increase references on normal
- * pages, as page pool aware skbs may also have normal page fragments.
- */
-static int skb_pp_frag_ref(struct sk_buff *skb)
-{
-       struct skb_shared_info *shinfo;
-       struct page *head_page;
-       int i;
-
-       if (!skb->pp_recycle)
-               return -EINVAL;
-
-       shinfo = skb_shinfo(skb);
-
-       for (i = 0; i < shinfo->nr_frags; i++) {
-               head_page = compound_head(skb_frag_page(&shinfo->frags[i]));
-               if (likely(is_pp_page(head_page)))
-                       page_pool_ref_page(head_page);
-               else
-                       page_ref_inc(head_page);
-       }
-       return 0;
-}
-
 static void skb_kfree_head(void *head, unsigned int end_offset)
 {
        if (end_offset == SKB_SMALL_HEAD_HEADROOM)
@@ -4176,7 +4140,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)
                        to++;
 
                } else {
-                       __skb_frag_ref(fragfrom);
+                       __skb_frag_ref(fragfrom, skb->pp_recycle);
                        skb_frag_page_copy(fragto, fragfrom);
                        skb_frag_off_copy(fragto, fragfrom);
                        skb_frag_size_set(fragto, todo);
@@ -4826,7 +4790,7 @@ normal:
                        }
 
                        *nskb_frag = (i < 0) ? skb_head_frag_to_page_desc(frag_skb) : *frag;
-                       __skb_frag_ref(nskb_frag);
+                       __skb_frag_ref(nskb_frag, nskb->pp_recycle);
                        size = skb_frag_size(nskb_frag);
 
                        if (pos < offset) {
@@ -5957,10 +5921,8 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from,
        /* if the skb is not cloned this does nothing
         * since we set nr_frags to 0.
         */
-       if (skb_pp_frag_ref(from)) {
-               for (i = 0; i < from_shinfo->nr_frags; i++)
-                       __skb_frag_ref(&from_shinfo->frags[i]);
-       }
+       for (i = 0; i < from_shinfo->nr_frags; i++)
+               __skb_frag_ref(&from_shinfo->frags[i], from->pp_recycle);
 
        to->truesize += delta;
        to->len += len;