From: Jonathan Lemon <jonathan.lemon@gmail.com>
To: <netdev@vger.kernel.org>, <willemdebruijn.kernel@gmail.com>,
<edumazet@google.com>, <dsahern@gmail.com>
Cc: <kernel-team@fb.com>
Subject: [RFC PATCH v3 03/12] skbuff: Push status and refcounts into sock_zerocopy_callback
Date: Wed, 30 Dec 2020 11:12:35 -0800 [thread overview]
Message-ID: <20201230191244.610449-4-jonathan.lemon@gmail.com> (raw)
In-Reply-To: <20201230191244.610449-1-jonathan.lemon@gmail.com>
From: Jonathan Lemon <bsd@fb.com>
Before this change, the caller of sock_zerocopy_callback would
need to save the zerocopy status, decrement and check the refcount,
and then call the callback function - the callback was only invoked
when the refcount reached zero.
Now, the caller just passes the status into the callback function,
which saves the status and handles its own refcounts.
This makes the behavior of the sock_zerocopy_callback identical
to the tpacket and vhost callbacks.
Signed-off-by: Jonathan Lemon <jonathan.lemon@gmail.com>
---
include/linux/skbuff.h | 3 ---
net/core/skbuff.c | 14 +++++++++++---
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 3ca8d7c7b30c..52e96c35f5af 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1479,9 +1479,6 @@ static inline void skb_zcopy_clear(struct sk_buff *skb, bool zerocopy)
if (uarg) {
if (skb_zcopy_is_nouarg(skb)) {
/* no notification callback */
- } else if (uarg->callback == sock_zerocopy_callback) {
- uarg->zerocopy = uarg->zerocopy && zerocopy;
- sock_zerocopy_put(uarg);
} else {
uarg->callback(uarg, zerocopy);
}
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index d88963f47f7d..8c18940723ff 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -1194,7 +1194,7 @@ static bool skb_zerocopy_notify_extend(struct sk_buff *skb, u32 lo, u16 len)
return true;
}
-void sock_zerocopy_callback(struct ubuf_info *uarg, bool success)
+static void __sock_zerocopy_callback(struct ubuf_info *uarg)
{
struct sk_buff *tail, *skb = skb_from_uarg(uarg);
struct sock_exterr_skb *serr;
@@ -1222,7 +1222,7 @@ void sock_zerocopy_callback(struct ubuf_info *uarg, bool success)
serr->ee.ee_origin = SO_EE_ORIGIN_ZEROCOPY;
serr->ee.ee_data = hi;
serr->ee.ee_info = lo;
- if (!success)
+ if (!uarg->zerocopy)
serr->ee.ee_code |= SO_EE_CODE_ZEROCOPY_COPIED;
q = &sk->sk_error_queue;
@@ -1241,11 +1241,19 @@ void sock_zerocopy_callback(struct ubuf_info *uarg, bool success)
consume_skb(skb);
sock_put(sk);
}
+
+void sock_zerocopy_callback(struct ubuf_info *uarg, bool success)
+{
+ uarg->zerocopy = uarg->zerocopy & success;
+
+ if (refcount_dec_and_test(&uarg->refcnt))
+ __sock_zerocopy_callback(uarg);
+}
EXPORT_SYMBOL_GPL(sock_zerocopy_callback);
void sock_zerocopy_put(struct ubuf_info *uarg)
{
- if (uarg && refcount_dec_and_test(&uarg->refcnt))
+ if (uarg)
uarg->callback(uarg, uarg->zerocopy);
}
EXPORT_SYMBOL_GPL(sock_zerocopy_put);
--
2.24.1
next prev parent reply other threads:[~2020-12-30 19:13 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-30 19:12 [RFC PATCH v3 00/12] Generic zcopy_* functions Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 01/12] skbuff: remove unused skb_zcopy_abort function Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 02/12] skbuff: simplify sock_zerocopy_put Jonathan Lemon
2020-12-30 19:12 ` Jonathan Lemon [this message]
2020-12-30 19:12 ` [RFC PATCH v3 04/12] skbuff: replace sock_zerocopy_put() with skb_zcopy_put() Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 05/12] skbuff: replace sock_zerocopy_get with skb_zcopy_get Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 06/12] skbuff: Add skb parameter to the ubuf zerocopy callback Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 07/12] skbuff: Call sock_zerocopy_put_abort from skb_zcopy_put_abort Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 08/12] skbuff: Call skb_zcopy_clear() before unref'ing fragments Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 09/12] skbuff: rename sock_zerocopy_* to msg_zerocopy_* Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 10/12] net: group skb_shinfo zerocopy related bits together Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 11/12] skbuff: add flags to ubuf_info for ubuf setup Jonathan Lemon
2020-12-30 19:12 ` [RFC PATCH v3 12/12] tap/tun: add skb_zcopy_init() helper for initialization Jonathan Lemon
2021-01-04 17:39 ` [RFC PATCH v3 00/12] Generic zcopy_* functions Willem de Bruijn
2021-01-05 4:17 ` Jonathan Lemon
2021-01-05 4:22 ` Willem de Bruijn
2021-01-05 5:38 ` Jonathan Lemon
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=20201230191244.610449-4-jonathan.lemon@gmail.com \
--to=jonathan.lemon@gmail.com \
--cc=dsahern@gmail.com \
--cc=edumazet@google.com \
--cc=kernel-team@fb.com \
--cc=netdev@vger.kernel.org \
--cc=willemdebruijn.kernel@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).