Message ID | 20230607140559.2263470-10-dhowells@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | splice, net: Rewrite splice-to-socket, fix SPLICE_F_MORE and handle MSG_SPLICE_PAGES in AF_TLS | expand |
From: David Howells <dhowells@redhat.com> Date: Wed, 7 Jun 2023 15:05:54 +0100 > Allow splice to undo the effects of MSG_MORE after prematurely ending a > splice/sendfile due to getting an EOF condition (->splice_read() returned > 0) after splice had called sendmsg() with MSG_MORE set when the user didn't > set MSG_MORE. > > Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> > Link: https://lore.kernel.org/r/CAHk-=wh=V579PDYvkpnTobCLGczbgxpMgGmmhqiTyE34Cpi5Gg@mail.gmail.com/ > Signed-off-by: David Howells <dhowells@redhat.com> > cc: Tom Herbert <tom@herbertland.com> > cc: Tom Herbert <tom@quantonium.net> > cc: Cong Wang <cong.wang@bytedance.com> > cc: Jakub Kicinski <kuba@kernel.org> > cc: Eric Dumazet <edumazet@google.com> > cc: "David S. Miller" <davem@davemloft.net> > cc: Paolo Abeni <pabeni@redhat.com> > cc: Jens Axboe <axboe@kernel.dk> > cc: Matthew Wilcox <willy@infradead.org> > cc: netdev@vger.kernel.org > --- > net/kcm/kcmsock.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c > index ba22af16b96d..d0d8c54562d6 100644 > --- a/net/kcm/kcmsock.c > +++ b/net/kcm/kcmsock.c > @@ -968,6 +968,19 @@ static int kcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) > return err; > } > > +static void kcm_splice_eof(struct socket *sock) > +{ > + struct sock *sk = sock->sk; > + struct kcm_sock *kcm = kcm_sk(sk); > + > + if (skb_queue_empty(&sk->sk_write_queue)) nit: would be better to use skb_queue_empty_lockless(). > + return; > + > + lock_sock(sk); > + kcm_write_msgs(kcm); > + release_sock(sk); > +} > + > static ssize_t kcm_sendpage(struct socket *sock, struct page *page, > int offset, size_t size, int flags) > > @@ -1773,6 +1786,7 @@ static const struct proto_ops kcm_dgram_ops = { > .sendmsg = kcm_sendmsg, > .recvmsg = kcm_recvmsg, > .mmap = sock_no_mmap, > + .splice_eof = kcm_splice_eof, > .sendpage = kcm_sendpage, > }; > > @@ -1794,6 +1808,7 @@ static const struct proto_ops kcm_seqpacket_ops = { > .sendmsg = kcm_sendmsg, > .recvmsg = kcm_recvmsg, > .mmap = sock_no_mmap, > + .splice_eof = kcm_splice_eof, > .sendpage = kcm_sendpage, > .splice_read = kcm_splice_read, > };
Kuniyuki Iwashima <kuniyu@amazon.com> wrote: > > + if (skb_queue_empty(&sk->sk_write_queue)) > > nit: would be better to use skb_queue_empty_lockless(). Ok. David
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index ba22af16b96d..d0d8c54562d6 100644 --- a/net/kcm/kcmsock.c +++ b/net/kcm/kcmsock.c @@ -968,6 +968,19 @@ static int kcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) return err; } +static void kcm_splice_eof(struct socket *sock) +{ + struct sock *sk = sock->sk; + struct kcm_sock *kcm = kcm_sk(sk); + + if (skb_queue_empty(&sk->sk_write_queue)) + return; + + lock_sock(sk); + kcm_write_msgs(kcm); + release_sock(sk); +} + static ssize_t kcm_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags) @@ -1773,6 +1786,7 @@ static const struct proto_ops kcm_dgram_ops = { .sendmsg = kcm_sendmsg, .recvmsg = kcm_recvmsg, .mmap = sock_no_mmap, + .splice_eof = kcm_splice_eof, .sendpage = kcm_sendpage, }; @@ -1794,6 +1808,7 @@ static const struct proto_ops kcm_seqpacket_ops = { .sendmsg = kcm_sendmsg, .recvmsg = kcm_recvmsg, .mmap = sock_no_mmap, + .splice_eof = kcm_splice_eof, .sendpage = kcm_sendpage, .splice_read = kcm_splice_read, };
Allow splice to undo the effects of MSG_MORE after prematurely ending a splice/sendfile due to getting an EOF condition (->splice_read() returned 0) after splice had called sendmsg() with MSG_MORE set when the user didn't set MSG_MORE. Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> Link: https://lore.kernel.org/r/CAHk-=wh=V579PDYvkpnTobCLGczbgxpMgGmmhqiTyE34Cpi5Gg@mail.gmail.com/ Signed-off-by: David Howells <dhowells@redhat.com> cc: Tom Herbert <tom@herbertland.com> cc: Tom Herbert <tom@quantonium.net> cc: Cong Wang <cong.wang@bytedance.com> cc: Jakub Kicinski <kuba@kernel.org> cc: Eric Dumazet <edumazet@google.com> cc: "David S. Miller" <davem@davemloft.net> cc: Paolo Abeni <pabeni@redhat.com> cc: Jens Axboe <axboe@kernel.dk> cc: Matthew Wilcox <willy@infradead.org> cc: netdev@vger.kernel.org --- net/kcm/kcmsock.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)