All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com,
	willemb@google.com, fw@strlen.de,
	Jakub Kicinski <kuba@kernel.org>
Subject: [PATCH net-next 1/3] net: skb: carve the allocation out of skb_ext_add()
Date: Tue, 14 Feb 2023 19:43:53 -0800	[thread overview]
Message-ID: <20230215034355.481925-2-kuba@kernel.org> (raw)
In-Reply-To: <20230215034355.481925-1-kuba@kernel.org>

Subsequent patches will try to add different skb_ext allocation
methods. Refactor skb_ext_add() so that most of its code moves
into a tail-called helper, and allocation can be easily swapped
out.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
 net/core/skbuff.c | 52 ++++++++++++++++++++++++++++-------------------
 1 file changed, 31 insertions(+), 21 deletions(-)

diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 13ea10cf8544..6f0fc1f09536 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -6672,26 +6672,13 @@ void *__skb_ext_set(struct sk_buff *skb, enum skb_ext_id id,
 	return skb_ext_get_ptr(ext, id);
 }
 
-/**
- * skb_ext_add - allocate space for given extension, COW if needed
- * @skb: buffer
- * @id: extension to allocate space for
- *
- * Allocates enough space for the given extension.
- * If the extension is already present, a pointer to that extension
- * is returned.
- *
- * If the skb was cloned, COW applies and the returned memory can be
- * modified without changing the extension space of clones buffers.
- *
- * Returns pointer to the extension or NULL on allocation failure.
- */
-void *skb_ext_add(struct sk_buff *skb, enum skb_ext_id id)
+static void *skb_ext_add_finalize(struct sk_buff *skb, enum skb_ext_id id,
+				  struct skb_ext *new)
 {
-	struct skb_ext *new, *old = NULL;
 	unsigned int newlen, newoff;
+	struct skb_ext *old;
 
-	if (skb->active_extensions) {
+	if (!new) {
 		old = skb->extensions;
 
 		new = skb_ext_maybe_cow(old, skb->active_extensions);
@@ -6704,10 +6691,6 @@ void *skb_ext_add(struct sk_buff *skb, enum skb_ext_id id)
 		newoff = new->chunks;
 	} else {
 		newoff = SKB_EXT_CHUNKSIZEOF(*new);
-
-		new = __skb_ext_alloc(GFP_ATOMIC);
-		if (!new)
-			return NULL;
 	}
 
 	newlen = newoff + skb_ext_type_len[id];
@@ -6719,6 +6702,33 @@ void *skb_ext_add(struct sk_buff *skb, enum skb_ext_id id)
 	skb->active_extensions |= 1 << id;
 	return skb_ext_get_ptr(new, id);
 }
+
+/**
+ * skb_ext_add - allocate space for given extension, COW if needed
+ * @skb: buffer
+ * @id: extension to allocate space for
+ *
+ * Allocates enough space for the given extension.
+ * If the extension is already present, a pointer to that extension
+ * is returned.
+ *
+ * If the skb was cloned, COW applies and the returned memory can be
+ * modified without changing the extension space of clones buffers.
+ *
+ * Returns pointer to the extension or NULL on allocation failure.
+ */
+void *skb_ext_add(struct sk_buff *skb, enum skb_ext_id id)
+{
+	struct skb_ext *new = NULL;
+
+	if (!skb->active_extensions) {
+		new = __skb_ext_alloc(GFP_ATOMIC);
+		if (!new)
+			return NULL;
+	}
+
+	return skb_ext_add_finalize(skb, id, new);
+}
 EXPORT_SYMBOL(skb_ext_add);
 
 #ifdef CONFIG_XFRM
-- 
2.39.1


  reply	other threads:[~2023-02-15  3:44 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-15  3:43 [PATCH net-next 0/3] net: skbuff: cache one skb_ext for use by GRO Jakub Kicinski
2023-02-15  3:43 ` Jakub Kicinski [this message]
2023-02-15  3:43 ` [PATCH net-next 2/3] " Jakub Kicinski
2023-02-15  8:41   ` Paolo Abeni
2023-02-15 17:45     ` Jakub Kicinski
2023-02-15 18:08       ` Alexander Lobakin
2023-02-15 19:08         ` Paolo Abeni
2023-02-15 15:37   ` Edward Cree
2023-02-15 16:17     ` Alexander Lobakin
2023-02-15 17:52       ` Jakub Kicinski
2023-02-15 18:01         ` Alexander Lobakin
2023-02-15 18:20           ` Jakub Kicinski
2023-02-16 12:04             ` Alexander Lobakin
2023-02-15  3:43 ` [PATCH net-next 3/3] net: create and use NAPI version of tc_skb_ext_alloc() Jakub Kicinski
2023-02-15 16:50   ` Jamal Hadi Salim
2023-02-15 17:03     ` Jiri Pirko
2023-02-15 18:36       ` Jamal Hadi Salim
2023-02-15 17:35     ` Jakub Kicinski
2023-02-15 18:38       ` Jamal Hadi Salim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230215034355.481925-2-kuba@kernel.org \
    --to=kuba@kernel.org \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=fw@strlen.de \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=willemb@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.