* [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC
@ 2022-10-26 23:25 Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 1/4] udp: advertise ipv6 udp support for msghdr::ubuf_info Pavel Begunkov
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Pavel Begunkov @ 2022-10-26 23:25 UTC (permalink / raw)
To: netdev
Cc: Jakub Kicinski, David S . Miller, io-uring, John Fastabend,
asml.silence
There are several places/cases that got overlooked in regards to
SOCK_SUPPORT_ZC. We're lacking the flag for IPv6 UDP sockets and
accepted TCP sockets. We also should clear the flag when someone
tries to hijack a socket by replacing the ->sk_prot callbacks.
Pavel Begunkov (3):
udp: advertise ipv6 udp support for msghdr::ubuf_info
net: remove SOCK_SUPPORT_ZC from sockmap
net/ulp: remove SOCK_SUPPORT_ZC from tls sockets
Stefan Metzmacher (1):
net: also flag accepted sockets supporting msghdr originated zerocopy
include/net/sock.h | 7 +++++++
net/ipv4/af_inet.c | 2 ++
net/ipv4/tcp_bpf.c | 4 ++--
net/ipv4/tcp_ulp.c | 3 +++
net/ipv4/udp_bpf.c | 4 ++--
net/ipv6/udp.c | 1 +
net/unix/unix_bpf.c | 8 ++++----
7 files changed, 21 insertions(+), 8 deletions(-)
--
2.38.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net 1/4] udp: advertise ipv6 udp support for msghdr::ubuf_info
2022-10-26 23:25 [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC Pavel Begunkov
@ 2022-10-26 23:25 ` Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 2/4] net: remove SOCK_SUPPORT_ZC from sockmap Pavel Begunkov
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2022-10-26 23:25 UTC (permalink / raw)
To: netdev
Cc: Jakub Kicinski, David S . Miller, io-uring, John Fastabend,
asml.silence
Mark udp ipv6 as supporting msghdr::ubuf_info. In the original commit
SOCK_SUPPORT_ZC was supposed to be set by a udp_init_sock() call from
udp6_init_sock(), but
d38afeec26ed4 ("tcp/udp: Call inet6_destroy_sock() in IPv6 ...")
removed it and so ipv6 udp misses the flag.
Cc: <[email protected]> # 6.0
Fixes: e993ffe3da4bc ("net: flag sockets supporting msghdr originated zerocopy")
Signed-off-by: Pavel Begunkov <[email protected]>
---
net/ipv6/udp.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 129ec5a9b0eb..bc65e5b7195b 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -66,6 +66,7 @@ int udpv6_init_sock(struct sock *sk)
{
skb_queue_head_init(&udp_sk(sk)->reader_queue);
sk->sk_destruct = udpv6_destruct_sock;
+ set_bit(SOCK_SUPPORT_ZC, &sk->sk_socket->flags);
return 0;
}
--
2.38.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net 2/4] net: remove SOCK_SUPPORT_ZC from sockmap
2022-10-26 23:25 [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 1/4] udp: advertise ipv6 udp support for msghdr::ubuf_info Pavel Begunkov
@ 2022-10-26 23:25 ` Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 3/4] net/ulp: remove SOCK_SUPPORT_ZC from tls sockets Pavel Begunkov
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2022-10-26 23:25 UTC (permalink / raw)
To: netdev
Cc: Jakub Kicinski, David S . Miller, io-uring, John Fastabend,
asml.silence
sockmap replaces ->sk_prot with its own callbacks, we should remove
SOCK_SUPPORT_ZC as the new proto doesn't support msghdr::ubuf_info.
Cc: <[email protected]> # 6.0
Reported-by: Jakub Kicinski <[email protected]>
Fixes: e993ffe3da4bc ("net: flag sockets supporting msghdr originated zerocopy")
Signed-off-by: Pavel Begunkov <[email protected]>
---
include/net/sock.h | 7 +++++++
net/ipv4/tcp_bpf.c | 4 ++--
net/ipv4/udp_bpf.c | 4 ++--
net/unix/unix_bpf.c | 8 ++++----
4 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/include/net/sock.h b/include/net/sock.h
index 22f8bab583dd..5db02546941c 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -1889,6 +1889,13 @@ void sock_kfree_s(struct sock *sk, void *mem, int size);
void sock_kzfree_s(struct sock *sk, void *mem, int size);
void sk_send_sigurg(struct sock *sk);
+static inline void sock_replace_proto(struct sock *sk, struct proto *proto)
+{
+ if (sk->sk_socket)
+ clear_bit(SOCK_SUPPORT_ZC, &sk->sk_socket->flags);
+ WRITE_ONCE(sk->sk_prot, proto);
+}
+
struct sockcm_cookie {
u64 transmit_time;
u32 mark;
diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c
index a1626afe87a1..c501c329b1db 100644
--- a/net/ipv4/tcp_bpf.c
+++ b/net/ipv4/tcp_bpf.c
@@ -607,7 +607,7 @@ int tcp_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)
} else {
sk->sk_write_space = psock->saved_write_space;
/* Pairs with lockless read in sk_clone_lock() */
- WRITE_ONCE(sk->sk_prot, psock->sk_proto);
+ sock_replace_proto(sk, psock->sk_proto);
}
return 0;
}
@@ -620,7 +620,7 @@ int tcp_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)
}
/* Pairs with lockless read in sk_clone_lock() */
- WRITE_ONCE(sk->sk_prot, &tcp_bpf_prots[family][config]);
+ sock_replace_proto(sk, &tcp_bpf_prots[family][config]);
return 0;
}
EXPORT_SYMBOL_GPL(tcp_bpf_update_proto);
diff --git a/net/ipv4/udp_bpf.c b/net/ipv4/udp_bpf.c
index ff15918b7bdc..e5dc91d0e079 100644
--- a/net/ipv4/udp_bpf.c
+++ b/net/ipv4/udp_bpf.c
@@ -141,14 +141,14 @@ int udp_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)
if (restore) {
sk->sk_write_space = psock->saved_write_space;
- WRITE_ONCE(sk->sk_prot, psock->sk_proto);
+ sock_replace_proto(sk, psock->sk_proto);
return 0;
}
if (sk->sk_family == AF_INET6)
udp_bpf_check_v6_needs_rebuild(psock->sk_proto);
- WRITE_ONCE(sk->sk_prot, &udp_bpf_prots[family]);
+ sock_replace_proto(sk, &udp_bpf_prots[family]);
return 0;
}
EXPORT_SYMBOL_GPL(udp_bpf_update_proto);
diff --git a/net/unix/unix_bpf.c b/net/unix/unix_bpf.c
index 7cf14c6b1725..e9bf15513961 100644
--- a/net/unix/unix_bpf.c
+++ b/net/unix/unix_bpf.c
@@ -145,12 +145,12 @@ int unix_dgram_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool re
if (restore) {
sk->sk_write_space = psock->saved_write_space;
- WRITE_ONCE(sk->sk_prot, psock->sk_proto);
+ sock_replace_proto(sk, psock->sk_proto);
return 0;
}
unix_dgram_bpf_check_needs_rebuild(psock->sk_proto);
- WRITE_ONCE(sk->sk_prot, &unix_dgram_bpf_prot);
+ sock_replace_proto(sk, &unix_dgram_bpf_prot);
return 0;
}
@@ -158,12 +158,12 @@ int unix_stream_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool r
{
if (restore) {
sk->sk_write_space = psock->saved_write_space;
- WRITE_ONCE(sk->sk_prot, psock->sk_proto);
+ sock_replace_proto(sk, psock->sk_proto);
return 0;
}
unix_stream_bpf_check_needs_rebuild(psock->sk_proto);
- WRITE_ONCE(sk->sk_prot, &unix_stream_bpf_prot);
+ sock_replace_proto(sk, &unix_stream_bpf_prot);
return 0;
}
--
2.38.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net 3/4] net/ulp: remove SOCK_SUPPORT_ZC from tls sockets
2022-10-26 23:25 [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 1/4] udp: advertise ipv6 udp support for msghdr::ubuf_info Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 2/4] net: remove SOCK_SUPPORT_ZC from sockmap Pavel Begunkov
@ 2022-10-26 23:25 ` Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 4/4] net: also flag accepted sockets supporting msghdr originated zerocopy Pavel Begunkov
2022-10-29 4:50 ` [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC patchwork-bot+netdevbpf
4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2022-10-26 23:25 UTC (permalink / raw)
To: netdev
Cc: Jakub Kicinski, David S . Miller, io-uring, John Fastabend,
asml.silence
Remove SOCK_SUPPORT_ZC when we're setting ulp as it might not support
msghdr::ubuf_info, e.g. like TLS replacing ->sk_prot with a new set of
handlers.
Cc: <[email protected]> # 6.0
Reported-by: Jakub Kicinski <[email protected]>
Fixes: e993ffe3da4bc ("net: flag sockets supporting msghdr originated zerocopy")
Signed-off-by: Pavel Begunkov <[email protected]>
---
net/ipv4/tcp_ulp.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/net/ipv4/tcp_ulp.c b/net/ipv4/tcp_ulp.c
index 7c27aa629af1..9ae50b1bd844 100644
--- a/net/ipv4/tcp_ulp.c
+++ b/net/ipv4/tcp_ulp.c
@@ -136,6 +136,9 @@ static int __tcp_set_ulp(struct sock *sk, const struct tcp_ulp_ops *ulp_ops)
if (icsk->icsk_ulp_ops)
goto out_err;
+ if (sk->sk_socket)
+ clear_bit(SOCK_SUPPORT_ZC, &sk->sk_socket->flags);
+
err = ulp_ops->init(sk);
if (err)
goto out_err;
--
2.38.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net 4/4] net: also flag accepted sockets supporting msghdr originated zerocopy
2022-10-26 23:25 [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC Pavel Begunkov
` (2 preceding siblings ...)
2022-10-26 23:25 ` [PATCH net 3/4] net/ulp: remove SOCK_SUPPORT_ZC from tls sockets Pavel Begunkov
@ 2022-10-26 23:25 ` Pavel Begunkov
2022-10-29 4:50 ` [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC patchwork-bot+netdevbpf
4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2022-10-26 23:25 UTC (permalink / raw)
To: netdev
Cc: Jakub Kicinski, David S . Miller, io-uring, John Fastabend,
asml.silence, Stefan Metzmacher
From: Stefan Metzmacher <[email protected]>
Without this only the client initiated tcp sockets have SOCK_SUPPORT_ZC.
The listening socket on the server also has it, but the accepted
connections didn't, which meant IORING_OP_SEND[MSG]_ZC will always
fails with -EOPNOTSUPP.
Fixes: e993ffe3da4b ("net: flag sockets supporting msghdr originated zerocopy")
Cc: <[email protected]> # 6.0
CC: Pavel Begunkov <[email protected]>
Cc: Jakub Kicinski <[email protected]>
CC: Jens Axboe <[email protected]>
Link: https://lore.kernel.org/io-uring/[email protected]/T/#m38aa19b0b825758fb97860a38ad13122051f9dda
Signed-off-by: Stefan Metzmacher <[email protected]>
Signed-off-by: Pavel Begunkov <[email protected]>
---
net/ipv4/af_inet.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 3dd02396517d..4728087c42a5 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -754,6 +754,8 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags,
(TCPF_ESTABLISHED | TCPF_SYN_RECV |
TCPF_CLOSE_WAIT | TCPF_CLOSE)));
+ if (test_bit(SOCK_SUPPORT_ZC, &sock->flags))
+ set_bit(SOCK_SUPPORT_ZC, &newsock->flags);
sock_graft(sk2, newsock);
newsock->state = SS_CONNECTED;
--
2.38.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC
2022-10-26 23:25 [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC Pavel Begunkov
` (3 preceding siblings ...)
2022-10-26 23:25 ` [PATCH net 4/4] net: also flag accepted sockets supporting msghdr originated zerocopy Pavel Begunkov
@ 2022-10-29 4:50 ` patchwork-bot+netdevbpf
4 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2022-10-29 4:50 UTC (permalink / raw)
To: Pavel Begunkov; +Cc: netdev, kuba, davem, io-uring, john.fastabend
Hello:
This series was applied to netdev/net.git (master)
by Jakub Kicinski <[email protected]>:
On Thu, 27 Oct 2022 00:25:55 +0100 you wrote:
> There are several places/cases that got overlooked in regards to
> SOCK_SUPPORT_ZC. We're lacking the flag for IPv6 UDP sockets and
> accepted TCP sockets. We also should clear the flag when someone
> tries to hijack a socket by replacing the ->sk_prot callbacks.
>
> Pavel Begunkov (3):
> udp: advertise ipv6 udp support for msghdr::ubuf_info
> net: remove SOCK_SUPPORT_ZC from sockmap
> net/ulp: remove SOCK_SUPPORT_ZC from tls sockets
>
> [...]
Here is the summary with links:
- [net,1/4] udp: advertise ipv6 udp support for msghdr::ubuf_info
https://git.kernel.org/netdev/net/c/8f279fb00bb2
- [net,2/4] net: remove SOCK_SUPPORT_ZC from sockmap
https://git.kernel.org/netdev/net/c/fee9ac06647e
- [net,3/4] net/ulp: remove SOCK_SUPPORT_ZC from tls sockets
https://git.kernel.org/netdev/net/c/e276d62dcfde
- [net,4/4] net: also flag accepted sockets supporting msghdr originated zerocopy
https://git.kernel.org/netdev/net/c/71b7786ea478
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-10-29 4:50 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-26 23:25 [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 1/4] udp: advertise ipv6 udp support for msghdr::ubuf_info Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 2/4] net: remove SOCK_SUPPORT_ZC from sockmap Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 3/4] net/ulp: remove SOCK_SUPPORT_ZC from tls sockets Pavel Begunkov
2022-10-26 23:25 ` [PATCH net 4/4] net: also flag accepted sockets supporting msghdr originated zerocopy Pavel Begunkov
2022-10-29 4:50 ` [PATCH net 0/4] a few corrections for SOCK_SUPPORT_ZC patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox