]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: introduce __skb_fill_page_desc_noacc
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 12 Jul 2022 20:52:32 +0000 (21:52 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 15 Sep 2022 08:47:15 +0000 (10:47 +0200)
[ Upstream commit 84ce071e38a6e25ea3ea91188e5482ac1f17b3af ]

Managed pages contain pinned userspace pages and controlled by upper
layers, there is no need in tracking skb->pfmemalloc for them. Introduce
a helper for filling frags but ignoring page tracking, it'll be needed
later.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/linux/skbuff.h

index 2f41364a6791ef5393c8a02401fd846c2c5e3030..b0a1374043f30f8dd8cb8300b5969ffd388eb8c2 100644 (file)
@@ -2528,6 +2528,22 @@ static inline unsigned int skb_pagelen(const struct sk_buff *skb)
        return skb_headlen(skb) + __skb_pagelen(skb);
 }
 
+static inline void __skb_fill_page_desc_noacc(struct skb_shared_info *shinfo,
+                                             int i, struct page *page,
+                                             int off, int size)
+{
+       skb_frag_t *frag = &shinfo->frags[i];
+
+       /*
+        * Propagate page pfmemalloc to the skb if we can. The problem is
+        * that not all callers have unique ownership of the page but rely
+        * on page_is_pfmemalloc doing the right thing(tm).
+        */
+       frag->bv_page             = page;
+       frag->bv_offset           = off;
+       skb_frag_size_set(frag, size);
+}
+
 /**
  * __skb_fill_page_desc - initialise a paged fragment in an skb
  * @skb: buffer containing fragment to be initialised
@@ -2544,17 +2560,7 @@ static inline unsigned int skb_pagelen(const struct sk_buff *skb)
 static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
                                        struct page *page, int off, int size)
 {
-       skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-
-       /*
-        * Propagate page pfmemalloc to the skb if we can. The problem is
-        * that not all callers have unique ownership of the page but rely
-        * on page_is_pfmemalloc doing the right thing(tm).
-        */
-       frag->bv_page             = page;
-       frag->bv_offset           = off;
-       skb_frag_size_set(frag, size);
-
+       __skb_fill_page_desc_noacc(skb_shinfo(skb), i, page, off, size);
        page = compound_head(page);
        if (page_is_pfmemalloc(page))
                skb->pfmemalloc = true;