[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <62db530f5b9875c820c97d4b6b2f30b511d94468.1648981571.git.asml.silence@gmail.com>
Date: Sun, 3 Apr 2022 14:06:17 +0100
From: Pavel Begunkov <asml.silence@...il.com>
To: netdev@...r.kernel.org, "David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>
Cc: Eric Dumazet <edumazet@...gle.com>, Wei Liu <wei.liu@...nel.org>,
Paul Durrant <paul@....org>,
Pavel Begunkov <asml.silence@...il.com>
Subject: [PATCH net-next 05/27] skbuff: drop null check from skb_zcopy
skb_zcopy() is used all around the networkong code including generic
paths. Many callers pass only a non-null skb, so we can remove it from
there and fix up several callers that would be affected. It removes
extra checks from zerocopy paths but also sheds some bytes from the
binary.
text data bss dec hex filename
8521472 0 0 8521472 820700 arch/x86/boot/bzImage
8521056 0 0 8521056 820560 arch/x86/boot/bzImage
delta=416B
Signed-off-by: Pavel Begunkov <asml.silence@...il.com>
---
include/linux/skbuff.h | 2 +-
net/core/dev.c | 2 +-
net/core/skbuff.c | 3 ++-
net/ipv4/ip_output.c | 7 +++++--
net/ipv4/tcp.c | 5 ++++-
net/ipv6/ip6_output.c | 7 +++++--
6 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index f5de5c9cc3da..10f94b1909da 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1649,7 +1649,7 @@ static inline struct skb_shared_hwtstamps *skb_hwtstamps(struct sk_buff *skb)
static inline struct ubuf_info *skb_zcopy(struct sk_buff *skb)
{
- bool is_zcopy = skb && skb_shinfo(skb)->flags & SKBFL_ZEROCOPY_ENABLE;
+ bool is_zcopy = skb_shinfo(skb)->flags & SKBFL_ZEROCOPY_ENABLE;
return is_zcopy ? skb_uarg(skb) : NULL;
}
diff --git a/net/core/dev.c b/net/core/dev.c
index 8a5109479dbe..4842a398f08d 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2286,7 +2286,7 @@ void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
}
out_unlock:
if (pt_prev) {
- if (!skb_orphan_frags_rx(skb2, GFP_ATOMIC))
+ if (!skb2 || !skb_orphan_frags_rx(skb2, GFP_ATOMIC))
pt_prev->func(skb2, skb->dev, pt_prev, skb->dev);
else
kfree_skb(skb2);
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 10bde7c6db44..7680314038b4 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -893,7 +893,8 @@ EXPORT_SYMBOL(skb_dump);
*/
void skb_tx_error(struct sk_buff *skb)
{
- skb_zcopy_clear(skb, true);
+ if (skb)
+ skb_zcopy_clear(skb, true);
}
EXPORT_SYMBOL(skb_tx_error);
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index f864b8c48e42..ab10b1f94669 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -1018,10 +1018,13 @@ static int __ip_append_data(struct sock *sk,
csummode = CHECKSUM_PARTIAL;
if (flags & MSG_ZEROCOPY && length && sock_flag(sk, SOCK_ZEROCOPY)) {
- uarg = msg_zerocopy_realloc(sk, length, skb_zcopy(skb));
+ if (skb)
+ uarg = skb_zcopy(skb);
+ extra_uref = !uarg; /* only ref on new uarg */
+
+ uarg = msg_zerocopy_realloc(sk, length, uarg);
if (!uarg)
return -ENOBUFS;
- extra_uref = !skb_zcopy(skb); /* only ref on new uarg */
if (rt->dst.dev->features & NETIF_F_SG &&
csummode == CHECKSUM_PARTIAL) {
paged = true;
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index cf18fbcbf123..add71b703520 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1205,7 +1205,10 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
if (flags & MSG_ZEROCOPY && size && sock_flag(sk, SOCK_ZEROCOPY)) {
skb = tcp_write_queue_tail(sk);
- uarg = msg_zerocopy_realloc(sk, size, skb_zcopy(skb));
+ if (skb)
+ uarg = skb_zcopy(skb);
+
+ uarg = msg_zerocopy_realloc(sk, size, uarg);
if (!uarg) {
err = -ENOBUFS;
goto out_err;
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index e9b039f56637..f1ada6f2af7d 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1520,10 +1520,13 @@ static int __ip6_append_data(struct sock *sk,
csummode = CHECKSUM_PARTIAL;
if (flags & MSG_ZEROCOPY && length && sock_flag(sk, SOCK_ZEROCOPY)) {
- uarg = msg_zerocopy_realloc(sk, length, skb_zcopy(skb));
+ if (skb)
+ uarg = skb_zcopy(skb);
+ extra_uref = !uarg; /* only ref on new uarg */
+
+ uarg = msg_zerocopy_realloc(sk, length, uarg);
if (!uarg)
return -ENOBUFS;
- extra_uref = !skb_zcopy(skb); /* only ref on new uarg */
if (rt->dst.dev->features & NETIF_F_SG &&
csummode == CHECKSUM_PARTIAL) {
paged = true;
--
2.35.1
Powered by blists - more mailing lists