* [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it @ 2022-10-21 10:16 Pavel Begunkov 2022-10-21 10:16 ` [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy Pavel Begunkov ` (4 more replies) 0 siblings, 5 replies; 16+ messages in thread From: Pavel Begunkov @ 2022-10-21 10:16 UTC (permalink / raw) To: Jens Axboe, Jakub Kicinski, Paolo Abeni, David S . Miller Cc: io-uring, asml.silence, netdev, Stefan Metzmacher Some sockets don't care about msghdr::ubuf_info and would execute the request by copying data. Such fallback behaviour was always a pain in my experience, so we'd rather want to fail such requests and have a more robust api in the future. Mark struct socket that support it with a new SOCK_SUPPORT_ZC flag. I'm not entirely sure it's the best place for the flag but at least we don't have to do a bunch of extra dereferences in the hot path. P.S. patches 2 and 3 are not combined for backporting purposes. Pavel Begunkov (3): net: flag sockets supporting msghdr originated zerocopy io_uring/net: fail zc send when unsupported by socket io_uring/net: fail zc sendmsg when unsupported by socket include/linux/net.h | 1 + io_uring/net.c | 4 ++++ net/ipv4/tcp.c | 1 + net/ipv4/udp.c | 1 + 4 files changed, 7 insertions(+) -- 2.38.0 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy 2022-10-21 10:16 [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Pavel Begunkov @ 2022-10-21 10:16 ` Pavel Begunkov 2022-10-21 16:14 ` Jakub Kicinski 2022-10-21 10:16 ` [PATCH for-6.1 2/3] io_uring/net: fail zc send when unsupported by socket Pavel Begunkov ` (3 subsequent siblings) 4 siblings, 1 reply; 16+ messages in thread From: Pavel Begunkov @ 2022-10-21 10:16 UTC (permalink / raw) To: Jens Axboe, Jakub Kicinski, Paolo Abeni, David S . Miller Cc: io-uring, asml.silence, netdev, Stefan Metzmacher We need an efficient way in io_uring to check whether a socket supports zerocopy with msghdr provided ubuf_info. Add a new flag into the struct socket flags fields. Cc: <[email protected]> # 6.0 Signed-off-by: Pavel Begunkov <[email protected]> --- include/linux/net.h | 1 + net/ipv4/tcp.c | 1 + net/ipv4/udp.c | 1 + 3 files changed, 3 insertions(+) diff --git a/include/linux/net.h b/include/linux/net.h index 711c3593c3b8..18d942bbdf6e 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -41,6 +41,7 @@ struct net; #define SOCK_NOSPACE 2 #define SOCK_PASSCRED 3 #define SOCK_PASSSEC 4 +#define SOCK_SUPPORT_ZC 5 #ifndef ARCH_HAS_SOCKET_TYPES /** diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 0c51abeee172..aeb7b9eaddc7 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -457,6 +457,7 @@ void tcp_init_sock(struct sock *sk) WRITE_ONCE(sk->sk_sndbuf, READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_wmem[1])); WRITE_ONCE(sk->sk_rcvbuf, READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_rmem[1])); + set_bit(SOCK_SUPPORT_ZC, &sk->sk_socket->flags); sk_sockets_allocated_inc(sk); } EXPORT_SYMBOL(tcp_init_sock); diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index d63118ce5900..03616fc5162c 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1620,6 +1620,7 @@ int udp_init_sock(struct sock *sk) { skb_queue_head_init(&udp_sk(sk)->reader_queue); sk->sk_destruct = udp_destruct_sock; + set_bit(SOCK_SUPPORT_ZC, &sk->sk_socket->flags); return 0; } EXPORT_SYMBOL_GPL(udp_init_sock); -- 2.38.0 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy 2022-10-21 10:16 ` [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy Pavel Begunkov @ 2022-10-21 16:14 ` Jakub Kicinski 2022-10-22 15:57 ` Pavel Begunkov 0 siblings, 1 reply; 16+ messages in thread From: Jakub Kicinski @ 2022-10-21 16:14 UTC (permalink / raw) To: Pavel Begunkov Cc: Jens Axboe, Paolo Abeni, David S . Miller, io-uring, netdev, Stefan Metzmacher On Fri, 21 Oct 2022 11:16:39 +0100 Pavel Begunkov wrote: > We need an efficient way in io_uring to check whether a socket supports > zerocopy with msghdr provided ubuf_info. Add a new flag into the struct > socket flags fields. > > Cc: <[email protected]> # 6.0 > Signed-off-by: Pavel Begunkov <[email protected]> > --- > include/linux/net.h | 1 + > net/ipv4/tcp.c | 1 + > net/ipv4/udp.c | 1 + > 3 files changed, 3 insertions(+) > > diff --git a/include/linux/net.h b/include/linux/net.h > index 711c3593c3b8..18d942bbdf6e 100644 > --- a/include/linux/net.h > +++ b/include/linux/net.h > @@ -41,6 +41,7 @@ struct net; > #define SOCK_NOSPACE 2 > #define SOCK_PASSCRED 3 > #define SOCK_PASSSEC 4 > +#define SOCK_SUPPORT_ZC 5 Acked-by: Jakub Kicinski <[email protected]> Any idea on when this will make it to Linus? If within a week we can probably delay: https://lore.kernel.org/all/dc549a4d5c1d2031c64794c8e12bed55afb85c3e.1666287924.git.pabeni@redhat.com/ and avoid the conflict. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy 2022-10-21 16:14 ` Jakub Kicinski @ 2022-10-22 15:57 ` Pavel Begunkov 2022-10-22 16:07 ` Jens Axboe 0 siblings, 1 reply; 16+ messages in thread From: Pavel Begunkov @ 2022-10-22 15:57 UTC (permalink / raw) To: Jakub Kicinski Cc: Jens Axboe, Paolo Abeni, David S . Miller, io-uring, netdev, Stefan Metzmacher On 10/21/22 17:14, Jakub Kicinski wrote: > On Fri, 21 Oct 2022 11:16:39 +0100 Pavel Begunkov wrote: >> We need an efficient way in io_uring to check whether a socket supports >> zerocopy with msghdr provided ubuf_info. Add a new flag into the struct >> socket flags fields. >> >> Cc: <[email protected]> # 6.0 >> Signed-off-by: Pavel Begunkov <[email protected]> >> --- >> include/linux/net.h | 1 + >> net/ipv4/tcp.c | 1 + >> net/ipv4/udp.c | 1 + >> 3 files changed, 3 insertions(+) >> >> diff --git a/include/linux/net.h b/include/linux/net.h >> index 711c3593c3b8..18d942bbdf6e 100644 >> --- a/include/linux/net.h >> +++ b/include/linux/net.h >> @@ -41,6 +41,7 @@ struct net; >> #define SOCK_NOSPACE 2 >> #define SOCK_PASSCRED 3 >> #define SOCK_PASSSEC 4 >> +#define SOCK_SUPPORT_ZC 5 > > Acked-by: Jakub Kicinski <[email protected]> > > Any idea on when this will make it to Linus? If within a week we can > probably delay: After a chat with Jens, IIUC he can take it and send out to Linus early. So, sounds like a good plan > https://lore.kernel.org/all/dc549a4d5c1d2031c64794c8e12bed55afb85c3e.1666287924.git.pabeni@redhat.com/ > and avoid the conflict. -- Pavel Begunkov ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy 2022-10-22 15:57 ` Pavel Begunkov @ 2022-10-22 16:07 ` Jens Axboe 2022-10-24 12:49 ` Stefan Metzmacher 0 siblings, 1 reply; 16+ messages in thread From: Jens Axboe @ 2022-10-22 16:07 UTC (permalink / raw) To: Pavel Begunkov, Jakub Kicinski Cc: Paolo Abeni, David S . Miller, io-uring, netdev, Stefan Metzmacher On 10/22/22 9:57 AM, Pavel Begunkov wrote: > On 10/21/22 17:14, Jakub Kicinski wrote: >> On Fri, 21 Oct 2022 11:16:39 +0100 Pavel Begunkov wrote: >>> We need an efficient way in io_uring to check whether a socket supports >>> zerocopy with msghdr provided ubuf_info. Add a new flag into the struct >>> socket flags fields. >>> >>> Cc: <[email protected]> # 6.0 >>> Signed-off-by: Pavel Begunkov <[email protected]> >>> --- >>> ? include/linux/net.h | 1 + >>> ? net/ipv4/tcp.c????? | 1 + >>> ? net/ipv4/udp.c????? | 1 + >>> ? 3 files changed, 3 insertions(+) >>> >>> diff --git a/include/linux/net.h b/include/linux/net.h >>> index 711c3593c3b8..18d942bbdf6e 100644 >>> --- a/include/linux/net.h >>> +++ b/include/linux/net.h >>> @@ -41,6 +41,7 @@ struct net; >>> ? #define SOCK_NOSPACE??????? 2 >>> ? #define SOCK_PASSCRED??????? 3 >>> ? #define SOCK_PASSSEC??????? 4 >>> +#define SOCK_SUPPORT_ZC??????? 5 >> >> Acked-by: Jakub Kicinski <[email protected]> >> >> Any idea on when this will make it to Linus? If within a week we can >> probably delay: > > After a chat with Jens, IIUC he can take it and send out to > Linus early. So, sounds like a good plan Yes, and let's retain the name for now, can always be changed if we need to make it more granular. I'll ship this off before -rc2. -- Jens Axboe ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy 2022-10-22 16:07 ` Jens Axboe @ 2022-10-24 12:49 ` Stefan Metzmacher 2022-10-24 14:12 ` Stefan Metzmacher 0 siblings, 1 reply; 16+ messages in thread From: Stefan Metzmacher @ 2022-10-24 12:49 UTC (permalink / raw) To: Jens Axboe, Pavel Begunkov, Jakub Kicinski Cc: Paolo Abeni, David S . Miller, io-uring, netdev Am 22.10.22 um 18:07 schrieb Jens Axboe: > On 10/22/22 9:57 AM, Pavel Begunkov wrote: >> On 10/21/22 17:14, Jakub Kicinski wrote: >>> On Fri, 21 Oct 2022 11:16:39 +0100 Pavel Begunkov wrote: >>>> We need an efficient way in io_uring to check whether a socket supports >>>> zerocopy with msghdr provided ubuf_info. Add a new flag into the struct >>>> socket flags fields. >>>> >>>> Cc: <[email protected]> # 6.0 >>>> Signed-off-by: Pavel Begunkov <[email protected]> >>>> --- >>>> ? include/linux/net.h | 1 + >>>> ? net/ipv4/tcp.c????? | 1 + >>>> ? net/ipv4/udp.c????? | 1 + >>>> ? 3 files changed, 3 insertions(+) >>>> >>>> diff --git a/include/linux/net.h b/include/linux/net.h >>>> index 711c3593c3b8..18d942bbdf6e 100644 >>>> --- a/include/linux/net.h >>>> +++ b/include/linux/net.h >>>> @@ -41,6 +41,7 @@ struct net; >>>> ? #define SOCK_NOSPACE??????? 2 >>>> ? #define SOCK_PASSCRED??????? 3 >>>> ? #define SOCK_PASSSEC??????? 4 >>>> +#define SOCK_SUPPORT_ZC??????? 5 >>> >>> Acked-by: Jakub Kicinski <[email protected]> >>> >>> Any idea on when this will make it to Linus? If within a week we can >>> probably delay: >> >> After a chat with Jens, IIUC he can take it and send out to >> Linus early. So, sounds like a good plan > > Yes, and let's retain the name for now, can always be changed if we need > to make it more granular. I'll ship this off before -rc2. I'm now always getting -EOPNOTSUPP from SENDMSG_ZC for tcp connections... metze ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy 2022-10-24 12:49 ` Stefan Metzmacher @ 2022-10-24 14:12 ` Stefan Metzmacher 2022-10-24 17:00 ` Pavel Begunkov 0 siblings, 1 reply; 16+ messages in thread From: Stefan Metzmacher @ 2022-10-24 14:12 UTC (permalink / raw) To: Jens Axboe, Pavel Begunkov, Jakub Kicinski Cc: Paolo Abeni, David S . Miller, io-uring, netdev Am 24.10.22 um 14:49 schrieb Stefan Metzmacher: > Am 22.10.22 um 18:07 schrieb Jens Axboe: >> On 10/22/22 9:57 AM, Pavel Begunkov wrote: >>> On 10/21/22 17:14, Jakub Kicinski wrote: >>>> On Fri, 21 Oct 2022 11:16:39 +0100 Pavel Begunkov wrote: >>>>> We need an efficient way in io_uring to check whether a socket supports >>>>> zerocopy with msghdr provided ubuf_info. Add a new flag into the struct >>>>> socket flags fields. >>>>> >>>>> Cc: <[email protected]> # 6.0 >>>>> Signed-off-by: Pavel Begunkov <[email protected]> >>>>> --- >>>>> ? include/linux/net.h | 1 + >>>>> ? net/ipv4/tcp.c????? | 1 + >>>>> ? net/ipv4/udp.c????? | 1 + >>>>> ? 3 files changed, 3 insertions(+) >>>>> >>>>> diff --git a/include/linux/net.h b/include/linux/net.h >>>>> index 711c3593c3b8..18d942bbdf6e 100644 >>>>> --- a/include/linux/net.h >>>>> +++ b/include/linux/net.h >>>>> @@ -41,6 +41,7 @@ struct net; >>>>> ? #define SOCK_NOSPACE??????? 2 >>>>> ? #define SOCK_PASSCRED??????? 3 >>>>> ? #define SOCK_PASSSEC??????? 4 >>>>> +#define SOCK_SUPPORT_ZC??????? 5 >>>> >>>> Acked-by: Jakub Kicinski <[email protected]> >>>> >>>> Any idea on when this will make it to Linus? If within a week we can >>>> probably delay: >>> >>> After a chat with Jens, IIUC he can take it and send out to >>> Linus early. So, sounds like a good plan >> >> Yes, and let's retain the name for now, can always be changed if we need >> to make it more granular. I'll ship this off before -rc2. > > I'm now always getting -EOPNOTSUPP from SENDMSG_ZC for tcp connections... The problem is that inet_accept() doesn't set SOCK_SUPPORT_ZC... This hack below fixes it for me, but I'm sure there's a nicer way... The natural way would be to overload inet_csk_accept for tcp, but sk1->sk_prot->accept() is called with sk2->sk_socket == NULL, because sock_graft() is called later... metze diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 3dd02396517d..0f35f2a32756 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -736,6 +736,7 @@ EXPORT_SYMBOL(inet_stream_connect); * Accept a pending connection. The TCP layer now gives BSD semantics. */ +#include <net/transp_v6.h> int inet_accept(struct socket *sock, struct socket *newsock, int flags, bool kern) { @@ -754,6 +755,8 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags, (TCPF_ESTABLISHED | TCPF_SYN_RECV | TCPF_CLOSE_WAIT | TCPF_CLOSE))); + if (sk2->sk_prot == &tcp_prot || sk2->sk_prot == &tcpv6_prot) + set_bit(SOCK_SUPPORT_ZC, &newsock->flags); sock_graft(sk2, newsock); newsock->state = SS_CONNECTED; ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy 2022-10-24 14:12 ` Stefan Metzmacher @ 2022-10-24 17:00 ` Pavel Begunkov 2022-10-24 17:45 ` Stefan Metzmacher 0 siblings, 1 reply; 16+ messages in thread From: Pavel Begunkov @ 2022-10-24 17:00 UTC (permalink / raw) To: Stefan Metzmacher, Jens Axboe, Jakub Kicinski Cc: Paolo Abeni, David S . Miller, io-uring, netdev On 10/24/22 15:12, Stefan Metzmacher wrote: > Am 24.10.22 um 14:49 schrieb Stefan Metzmacher: >> Am 22.10.22 um 18:07 schrieb Jens Axboe: >>> On 10/22/22 9:57 AM, Pavel Begunkov wrote: >>>> On 10/21/22 17:14, Jakub Kicinski wrote: >>>>> On Fri, 21 Oct 2022 11:16:39 +0100 Pavel Begunkov wrote: >>>>>> We need an efficient way in io_uring to check whether a socket supports >>>>>> zerocopy with msghdr provided ubuf_info. Add a new flag into the struct >>>>>> socket flags fields. >>>>>> >>>>>> Cc: <[email protected]> # 6.0 >>>>>> Signed-off-by: Pavel Begunkov <[email protected]> >>>>>> --- >>>>>> ? include/linux/net.h | 1 + >>>>>> ? net/ipv4/tcp.c????? | 1 + >>>>>> ? net/ipv4/udp.c????? | 1 + >>>>>> ? 3 files changed, 3 insertions(+) >>>>>> >>>>>> diff --git a/include/linux/net.h b/include/linux/net.h >>>>>> index 711c3593c3b8..18d942bbdf6e 100644 >>>>>> --- a/include/linux/net.h >>>>>> +++ b/include/linux/net.h >>>>>> @@ -41,6 +41,7 @@ struct net; >>>>>> ? #define SOCK_NOSPACE??????? 2 >>>>>> ? #define SOCK_PASSCRED??????? 3 >>>>>> ? #define SOCK_PASSSEC??????? 4 >>>>>> +#define SOCK_SUPPORT_ZC??????? 5 >>>>> >>>>> Acked-by: Jakub Kicinski <[email protected]> >>>>> >>>>> Any idea on when this will make it to Linus? If within a week we can >>>>> probably delay: >>>> >>>> After a chat with Jens, IIUC he can take it and send out to >>>> Linus early. So, sounds like a good plan >>> >>> Yes, and let's retain the name for now, can always be changed if we need >>> to make it more granular. I'll ship this off before -rc2. >> >> I'm now always getting -EOPNOTSUPP from SENDMSG_ZC for tcp connections... > > The problem is that inet_accept() doesn't set SOCK_SUPPORT_ZC... Yeah, you're right, accept is not handled, not great. Thanks for tracking it down. And I'll add a test for it > This hack below fixes it for me, but I'm sure there's a nicer way... > > The natural way would be to overload inet_csk_accept for tcp, > but sk1->sk_prot->accept() is called with sk2->sk_socket == NULL, > because sock_graft() is called later... I think it's acceptable for a fix. sk_is_tcp() sounds a bit better assuming that sk_type/protocol are set there. > diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c > index 3dd02396517d..0f35f2a32756 100644 > --- a/net/ipv4/af_inet.c > +++ b/net/ipv4/af_inet.c > @@ -736,6 +736,7 @@ EXPORT_SYMBOL(inet_stream_connect); > * Accept a pending connection. The TCP layer now gives BSD semantics. > */ > > +#include <net/transp_v6.h> > int inet_accept(struct socket *sock, struct socket *newsock, int flags, > bool kern) > { > @@ -754,6 +755,8 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags, > (TCPF_ESTABLISHED | TCPF_SYN_RECV | > TCPF_CLOSE_WAIT | TCPF_CLOSE))); > > + if (sk2->sk_prot == &tcp_prot || sk2->sk_prot == &tcpv6_prot) > + set_bit(SOCK_SUPPORT_ZC, &newsock->flags); > sock_graft(sk2, newsock); > > newsock->state = SS_CONNECTED; -- Pavel Begunkov ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy 2022-10-24 17:00 ` Pavel Begunkov @ 2022-10-24 17:45 ` Stefan Metzmacher 0 siblings, 0 replies; 16+ messages in thread From: Stefan Metzmacher @ 2022-10-24 17:45 UTC (permalink / raw) To: Pavel Begunkov, Jens Axboe, Jakub Kicinski Cc: Paolo Abeni, David S . Miller, io-uring, netdev Am 24.10.22 um 19:00 schrieb Pavel Begunkov: > On 10/24/22 15:12, Stefan Metzmacher wrote: >> Am 24.10.22 um 14:49 schrieb Stefan Metzmacher: >>> Am 22.10.22 um 18:07 schrieb Jens Axboe: >>>> On 10/22/22 9:57 AM, Pavel Begunkov wrote: >>>>> On 10/21/22 17:14, Jakub Kicinski wrote: >>>>>> On Fri, 21 Oct 2022 11:16:39 +0100 Pavel Begunkov wrote: >>>>>>> We need an efficient way in io_uring to check whether a socket supports >>>>>>> zerocopy with msghdr provided ubuf_info. Add a new flag into the struct >>>>>>> socket flags fields. >>>>>>> >>>>>>> Cc: <[email protected]> # 6.0 >>>>>>> Signed-off-by: Pavel Begunkov <[email protected]> >>>>>>> --- >>>>>>> ? include/linux/net.h | 1 + >>>>>>> ? net/ipv4/tcp.c????? | 1 + >>>>>>> ? net/ipv4/udp.c????? | 1 + >>>>>>> ? 3 files changed, 3 insertions(+) >>>>>>> >>>>>>> diff --git a/include/linux/net.h b/include/linux/net.h >>>>>>> index 711c3593c3b8..18d942bbdf6e 100644 >>>>>>> --- a/include/linux/net.h >>>>>>> +++ b/include/linux/net.h >>>>>>> @@ -41,6 +41,7 @@ struct net; >>>>>>> ? #define SOCK_NOSPACE??????? 2 >>>>>>> ? #define SOCK_PASSCRED??????? 3 >>>>>>> ? #define SOCK_PASSSEC??????? 4 >>>>>>> +#define SOCK_SUPPORT_ZC??????? 5 >>>>>> >>>>>> Acked-by: Jakub Kicinski <[email protected]> >>>>>> >>>>>> Any idea on when this will make it to Linus? If within a week we can >>>>>> probably delay: >>>>> >>>>> After a chat with Jens, IIUC he can take it and send out to >>>>> Linus early. So, sounds like a good plan >>>> >>>> Yes, and let's retain the name for now, can always be changed if we need >>>> to make it more granular. I'll ship this off before -rc2. >>> >>> I'm now always getting -EOPNOTSUPP from SENDMSG_ZC for tcp connections... >> >> The problem is that inet_accept() doesn't set SOCK_SUPPORT_ZC... > > Yeah, you're right, accept is not handled, not great. Thanks > for tracking it down. And I'll add a test for it > > >> This hack below fixes it for me, but I'm sure there's a nicer way... >> >> The natural way would be to overload inet_csk_accept for tcp, >> but sk1->sk_prot->accept() is called with sk2->sk_socket == NULL, >> because sock_graft() is called later... > > I think it's acceptable for a fix. sk_is_tcp() sounds a bit better > assuming that sk_type/protocol are set there. > > >> diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c >> index 3dd02396517d..0f35f2a32756 100644 >> --- a/net/ipv4/af_inet.c >> +++ b/net/ipv4/af_inet.c >> @@ -736,6 +736,7 @@ EXPORT_SYMBOL(inet_stream_connect); >> * Accept a pending connection. The TCP layer now gives BSD semantics. >> */ >> >> +#include <net/transp_v6.h> >> int inet_accept(struct socket *sock, struct socket *newsock, int flags, >> bool kern) >> { >> @@ -754,6 +755,8 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags, >> (TCPF_ESTABLISHED | TCPF_SYN_RECV | >> TCPF_CLOSE_WAIT | TCPF_CLOSE))); >> >> + if (sk2->sk_prot == &tcp_prot || sk2->sk_prot == &tcpv6_prot) >> + set_bit(SOCK_SUPPORT_ZC, &newsock->flags); >> sock_graft(sk2, newsock); Hmm, I think we just need to check if the flag was set on the listening socket, otherwise we have a hard coded value again... This also works for me, and seems like a much nicer patch: 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; ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH for-6.1 2/3] io_uring/net: fail zc send when unsupported by socket 2022-10-21 10:16 [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Pavel Begunkov 2022-10-21 10:16 ` [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy Pavel Begunkov @ 2022-10-21 10:16 ` Pavel Begunkov 2022-10-21 10:16 ` [PATCH for-6.1 3/3] io_uring/net: fail zc sendmsg " Pavel Begunkov ` (2 subsequent siblings) 4 siblings, 0 replies; 16+ messages in thread From: Pavel Begunkov @ 2022-10-21 10:16 UTC (permalink / raw) To: Jens Axboe, Jakub Kicinski, Paolo Abeni, David S . Miller Cc: io-uring, asml.silence, netdev, Stefan Metzmacher If a protocol doesn't support zerocopy it will silently fall back to copying. This type of behaviour has always been a source of troubles so it's better to fail such requests instead. Cc: <[email protected]> # 6.0 Signed-off-by: Pavel Begunkov <[email protected]> --- io_uring/net.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/io_uring/net.c b/io_uring/net.c index 8c7226b5bf41..26ff3675214d 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -1056,6 +1056,8 @@ int io_send_zc(struct io_kiocb *req, unsigned int issue_flags) sock = sock_from_file(req->file); if (unlikely(!sock)) return -ENOTSOCK; + if (!test_bit(SOCK_SUPPORT_ZC, &sock->flags)) + return -EOPNOTSUPP; msg.msg_name = NULL; msg.msg_control = NULL; -- 2.38.0 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH for-6.1 3/3] io_uring/net: fail zc sendmsg when unsupported by socket 2022-10-21 10:16 [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Pavel Begunkov 2022-10-21 10:16 ` [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy Pavel Begunkov 2022-10-21 10:16 ` [PATCH for-6.1 2/3] io_uring/net: fail zc send when unsupported by socket Pavel Begunkov @ 2022-10-21 10:16 ` Pavel Begunkov 2022-10-21 10:27 ` [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Stefan Metzmacher 2022-10-24 20:40 ` patchwork-bot+netdevbpf 4 siblings, 0 replies; 16+ messages in thread From: Pavel Begunkov @ 2022-10-21 10:16 UTC (permalink / raw) To: Jens Axboe, Jakub Kicinski, Paolo Abeni, David S . Miller Cc: io-uring, asml.silence, netdev, Stefan Metzmacher The previous patch fails zerocopy send requests for protocols that don't support it, do the same for zerocopy sendmsg. Signed-off-by: Pavel Begunkov <[email protected]> --- io_uring/net.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/io_uring/net.c b/io_uring/net.c index 26ff3675214d..15dea91625e2 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -1153,6 +1153,8 @@ int io_sendmsg_zc(struct io_kiocb *req, unsigned int issue_flags) sock = sock_from_file(req->file); if (unlikely(!sock)) return -ENOTSOCK; + if (!test_bit(SOCK_SUPPORT_ZC, &sock->flags)) + return -EOPNOTSUPP; if (req_has_async_data(req)) { kmsg = req->async_data; -- 2.38.0 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it 2022-10-21 10:16 [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Pavel Begunkov ` (2 preceding siblings ...) 2022-10-21 10:16 ` [PATCH for-6.1 3/3] io_uring/net: fail zc sendmsg " Pavel Begunkov @ 2022-10-21 10:27 ` Stefan Metzmacher 2022-10-21 10:42 ` Pavel Begunkov 2022-10-24 20:40 ` patchwork-bot+netdevbpf 4 siblings, 1 reply; 16+ messages in thread From: Stefan Metzmacher @ 2022-10-21 10:27 UTC (permalink / raw) To: Pavel Begunkov, Jens Axboe, Jakub Kicinski, Paolo Abeni, David S . Miller Cc: io-uring, netdev Hi Pavel, > Some sockets don't care about msghdr::ubuf_info and would execute the > request by copying data. Such fallback behaviour was always a pain in > my experience, so we'd rather want to fail such requests and have a more > robust api in the future. > > Mark struct socket that support it with a new SOCK_SUPPORT_ZC flag. > I'm not entirely sure it's the best place for the flag but at least > we don't have to do a bunch of extra dereferences in the hot path. I'd give the flag another name that indicates msg_ubuf and have a 2nd flag that can indicate support for SO_ZEROCOPY in sk_setsockopt() The SO_ZEROCOPY version is also provided by AF_RDS. metze ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it 2022-10-21 10:27 ` [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Stefan Metzmacher @ 2022-10-21 10:42 ` Pavel Begunkov 2022-10-21 12:49 ` Stefan Metzmacher 0 siblings, 1 reply; 16+ messages in thread From: Pavel Begunkov @ 2022-10-21 10:42 UTC (permalink / raw) To: Stefan Metzmacher, Jens Axboe, Jakub Kicinski, Paolo Abeni, David S . Miller Cc: io-uring, netdev On 10/21/22 11:27, Stefan Metzmacher wrote: > Hi Pavel, > >> Some sockets don't care about msghdr::ubuf_info and would execute the >> request by copying data. Such fallback behaviour was always a pain in >> my experience, so we'd rather want to fail such requests and have a more >> robust api in the future. >> >> Mark struct socket that support it with a new SOCK_SUPPORT_ZC flag. >> I'm not entirely sure it's the best place for the flag but at least >> we don't have to do a bunch of extra dereferences in the hot path. > > I'd give the flag another name that indicates msg_ubuf and Could be renamed, e.g. SOCK_SUPPORT_MSGHDR_UBUF or maybe SOCK_SUPPORT_EXTERNAL_UBUF > have a 2nd flag that can indicate support for SO_ZEROCOPY in sk_setsockopt() There is absolutely no reason to introduce a second flag here, it has nothing to do with SO_ZEROCOPY. > The SO_ZEROCOPY version is also provided by AF_RDS. -- Pavel Begunkov ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it 2022-10-21 10:42 ` Pavel Begunkov @ 2022-10-21 12:49 ` Stefan Metzmacher 0 siblings, 0 replies; 16+ messages in thread From: Stefan Metzmacher @ 2022-10-21 12:49 UTC (permalink / raw) To: Pavel Begunkov, Jens Axboe, Jakub Kicinski, Paolo Abeni, David S . Miller Cc: io-uring, netdev Am 21.10.22 um 12:42 schrieb Pavel Begunkov: > On 10/21/22 11:27, Stefan Metzmacher wrote: >> Hi Pavel, >> >>> Some sockets don't care about msghdr::ubuf_info and would execute the >>> request by copying data. Such fallback behaviour was always a pain in >>> my experience, so we'd rather want to fail such requests and have a more >>> robust api in the future. >>> >>> Mark struct socket that support it with a new SOCK_SUPPORT_ZC flag. >>> I'm not entirely sure it's the best place for the flag but at least >>> we don't have to do a bunch of extra dereferences in the hot path. >> >> I'd give the flag another name that indicates msg_ubuf and > > Could be renamed, e.g. SOCK_SUPPORT_MSGHDR_UBUF That's good or SOCK_SUPPORT_ZC_MSGHDR_UBUF. >> have a 2nd flag that can indicate support for SO_ZEROCOPY in sk_setsockopt() > > There is absolutely no reason to introduce a second flag here, it has > nothing to do with SO_ZEROCOPY. I meant as a separate change to replace the hard coded logic in sk_setsockopt()... But I don't care much about it, it's unlikely that I ever want to use SO_ZEROCOPY... metze ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it 2022-10-21 10:16 [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Pavel Begunkov ` (3 preceding siblings ...) 2022-10-21 10:27 ` [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Stefan Metzmacher @ 2022-10-24 20:40 ` patchwork-bot+netdevbpf 2022-10-24 21:15 ` Jakub Kicinski 4 siblings, 1 reply; 16+ messages in thread From: patchwork-bot+netdevbpf @ 2022-10-24 20:40 UTC (permalink / raw) To: Pavel Begunkov; +Cc: axboe, kuba, pabeni, davem, io-uring, netdev, metze Hello: This series was applied to netdev/net.git (master) by Jens Axboe <[email protected]>: On Fri, 21 Oct 2022 11:16:38 +0100 you wrote: > Some sockets don't care about msghdr::ubuf_info and would execute the > request by copying data. Such fallback behaviour was always a pain in > my experience, so we'd rather want to fail such requests and have a more > robust api in the future. > > Mark struct socket that support it with a new SOCK_SUPPORT_ZC flag. > I'm not entirely sure it's the best place for the flag but at least > we don't have to do a bunch of extra dereferences in the hot path. > > [...] Here is the summary with links: - [for-6.1,1/3] net: flag sockets supporting msghdr originated zerocopy https://git.kernel.org/netdev/net/c/e993ffe3da4b - [for-6.1,2/3] io_uring/net: fail zc send when unsupported by socket https://git.kernel.org/netdev/net/c/edf81438799c - [for-6.1,3/3] io_uring/net: fail zc sendmsg when unsupported by socket https://git.kernel.org/netdev/net/c/cc767e7c6913 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] 16+ messages in thread
* Re: [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it 2022-10-24 20:40 ` patchwork-bot+netdevbpf @ 2022-10-24 21:15 ` Jakub Kicinski 0 siblings, 0 replies; 16+ messages in thread From: Jakub Kicinski @ 2022-10-24 21:15 UTC (permalink / raw) To: patchwork-bot+netdevbpf Cc: Pavel Begunkov, axboe, pabeni, davem, io-uring, netdev, metze On Mon, 24 Oct 2022 20:40:38 +0000 [email protected] wrote: > Here is the summary with links: > - [for-6.1,1/3] net: flag sockets supporting msghdr originated zerocopy > https://git.kernel.org/netdev/net/c/e993ffe3da4b > - [for-6.1,2/3] io_uring/net: fail zc send when unsupported by socket > https://git.kernel.org/netdev/net/c/edf81438799c > - [for-6.1,3/3] io_uring/net: fail zc sendmsg when unsupported by socket > https://git.kernel.org/netdev/net/c/cc767e7c6913 Ugh, ignore, looks like we forgot to drop this series from our PW and bot thought we've applied it when we forwarded the tree. ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2022-10-24 22:56 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-10-21 10:16 [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Pavel Begunkov 2022-10-21 10:16 ` [PATCH for-6.1 1/3] net: flag sockets supporting msghdr originated zerocopy Pavel Begunkov 2022-10-21 16:14 ` Jakub Kicinski 2022-10-22 15:57 ` Pavel Begunkov 2022-10-22 16:07 ` Jens Axboe 2022-10-24 12:49 ` Stefan Metzmacher 2022-10-24 14:12 ` Stefan Metzmacher 2022-10-24 17:00 ` Pavel Begunkov 2022-10-24 17:45 ` Stefan Metzmacher 2022-10-21 10:16 ` [PATCH for-6.1 2/3] io_uring/net: fail zc send when unsupported by socket Pavel Begunkov 2022-10-21 10:16 ` [PATCH for-6.1 3/3] io_uring/net: fail zc sendmsg " Pavel Begunkov 2022-10-21 10:27 ` [PATCH for-6.1 0/3] fail io_uring zc with sockets not supporting it Stefan Metzmacher 2022-10-21 10:42 ` Pavel Begunkov 2022-10-21 12:49 ` Stefan Metzmacher 2022-10-24 20:40 ` patchwork-bot+netdevbpf 2022-10-24 21:15 ` Jakub Kicinski
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox