Re: [PATCH net-next v5 6/6] tls: Flush backlog before waiting for a new record
Sabrina Dubroca <[email protected]> Tue, 24 Mar 2026 17:18:10 +0100
| Newsgroups | dev.linux.lists.kernel-tls-handshake,org.kernel.vger.netdev |
|---|---|
| Message-ID | <acK5Qj-F0wGFLUhj@krikkit> |
2026-03-24, 08:53:28 -0400, Chuck Lever wrote: > From: Chuck Lever <[email protected]> > > While lock_sock is held, incoming TCP segments land on > sk->sk_backlog rather than sk->sk_receive_queue. > tls_rx_rec_wait() inspects only sk_receive_queue, so > backlog data remains invisible. For non-blocking callers > (read_sock, and recvmsg or splice_read with MSG_DONTWAIT) > this causes a spurious -EAGAIN. For blocking callers it > forces an unnecessary sleep/wakeup cycle. > > Flush the backlog inside tls_rx_rec_wait() before checking > sk_receive_queue so the strparser can parse newly-arrived > segments immediately. > > Fixes: 20ffc7adf53a ("net/tls: missing received data after fast remote close") How did you pick that Fixes tag? That commit mentions FIN/connection closing, which doesn't seem related to the local backlog. And it's quite possible there was a similar problem when kTLS was using the generic strparser, but the code has changed so much with 84c61fe1a75b ("tls: rx: do not use the standard strparser") and the work around that, that blaming something older probably doesn't make too much sense. > Suggested-by: Sabrina Dubroca <[email protected]> > Reviewed-by: Hannes Reinecke <[email protected]> > Signed-off-by: Chuck Lever <[email protected]> > --- > net/tls/tls_sw.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c > index 8fb2f2a93846..84c4ae0330d1 100644 > --- a/net/tls/tls_sw.c > +++ b/net/tls/tls_sw.c > @@ -1372,6 +1372,7 @@ tls_rx_rec_wait(struct sock *sk, struct sk_psock *psock, bool nonblock, > if (ret < 0) > return ret; > > + sk_flush_backlog(sk); Do we need to update released when this returns true, like callers of tls_read_flush_backlog() do? I also wonder if we'd want to update the caller's flushed_at to avoid bypassing the "smart checks" in tls_read_flush_backlog(). > if (!skb_queue_empty(&sk->sk_receive_queue)) { > /* Defer notification to the exit point; > * this thread will consume the record -- Sabrina