Re: [PATCH net-next v2 2/6] net: Introduce read_sock_rectype proto_ops for control record delivery

Sabrina Dubroca <[email protected]> Wed, 29 Jul 2026 14:23:13 +0200
Newsgroups dev.linux.lists.kernel-tls-handshake,org.kernel.vger.linux-kselftest,org.kernel.vger.linux-nfs,org.kernel.vger.netdev
Message-ID <amnwsWrxv6KvrZ_L@krikkit>
2026-07-28, 22:51:30 -0400, Chuck Lever wrote:
> 
> 
> On Tue, Jul 28, 2026, at 10:30 PM, Jakub Kicinski wrote:
> > On Tue, 28 Jul 2026 21:57:21 -0400 Chuck Lever wrote:
> >> > To me this is an ugly one-off workaround that doesn't fit into 
> >> > the proto_ops (only TLS will use it). And you seem to net out
> >> > to the same LOC on SUNRPC side with and without this?  
> >> 
> >> It’s not about LOC. It’s about not cluttering the normal I/O
> >> path with a lot of exception processing to handle TLS Alert
> >> records. The CMSG API is very difficult to use and leaks the
> >> alert messages into I/O buffers (which for in-kernel consumers
> >> are page cache pages). It’s piss-poor API design.
> >
> > I'm not arguing that it's amazing. Doesn't mean we will YOLO
> > a special proto callback for every protocol stacking :/
> 
> No-one is asking you to roll over. Review means you get to steer
> us in the right direction, and I promise to do the leg work. Terse
> rejection doesn’t move the discussion forward. It stops it cold.
> 
> Complaining about slop also does not tell me where you need this
> to go. I use AI to go from blank page to RFC/v1. Where we go next
> is up to human taste, as always.

RFC/v1 wasn't sent to netdev.

[jumping to the end of your reply]
> I thought the RFC series cover letter made it clear that we are
> looking for input and direction, not to sell a completely formed idea.

Then this should have been tagged as "RFC v2". "PATCH v2" sounds more
like a fully formed idea.


I see in the RFC thread some doubts about whether read_sock is
actually helpful with TLS.

Ignoring the "does read_sock even help?" aspect, how much improvement
are you seeing by going from "read_sock with fallback to recvmsg+cmsg
in case we get a non-DATA record" to "read_sock_rectype"? (current
svcsock [before this series] doesn't use read_sock, it may be good to
compare those 3 variants and not just "old read_sock vs new
read_sock", but "read_sock vs read_sock++" is the important one to
justify an API change)

Non-DATA record should be fairly uncommon, I'm not that convinced "oh
well let's try again" once in a while causes a measurable degradation.

Even with recvmsg(), you have 2 choices:
 - pass a cmsg every time, and check the record type for every recv
 - don't pass a cmsg, and do a retry when you get -EIO

This proposal (call a different CB depending on record type) is... an
"interesting" approach.

> >> > There needs to be a very strong reason for us to add APIs for
> >> > in kernel consumers.  
> >> 
> >> This is not a helpful position. Your objection is the same
> >> every time, treating the in-kernel users as second-class
> >> citizens.
> >
> > No, it's not a second class citizen. But kernel consumers have a
> > tendency to break all abstractions and insert hacks all over the place
> > just because they are not forced to go via uAPI boundary which forces
> > people to think about the API design.
> 
> Granted that user space self-tests can’t reach kernel-only APIs.
> But that is what Kunit is for.
> 
> 
> > You just need to try a little harder to produce a better solution.
> > Rework or augment existing callbacks to let your achieve the behavior
> > you want.
> 
> My original approach was to add a new read_sock variant because I
> suspected you wouldn’t want read_sock itself to grow another argument.

Given that there's only 2 existing consumers of read_sock (strp and
nvme, and I'm not sure why strp/sockmap use it at all) [1], and 3
arguments to read_sock, adding an argument would be ok IMO. The
implementation (tls_sw_read_sock/tls_sw_read_sock_rectype) ends up
being a small wrapper around a function that does the actual work with
a NULL check, might as well propagate that to the callers.

For me the problem is more that this new argument is very specific to
TLS, and dropping something TLS-specific in a generic API (struct
proto_ops) is quite ugly. If we want to make this generic, we're back
to cmsg (or something cmsg-like). And then the benefit for users of
read_sock gets down to avoiding the "try read_sock, then fall back to
recvmsg" logic.


[1] well, there's also some users that call tcp_read_sock directly
[1], but I think they can be ignored other than "they'll need to pass
NULL since .read_sock = tcp_read_sock"
drivers/infiniband/sw/siw/siw_cm.c	tcp_read_sock(sk, &rd_desc, siw_tcp_rx_data);
drivers/infiniband/sw/siw/siw_qp.c	tcp_read_sock(sk, &rd_desc, siw_tcp_rx_data);
drivers/scsi/iscsi_tcp.c		tcp_read_sock(sk, &rd_desc, iscsi_sw_tcp_recv);
net/rds/tcp_recv.c			tcp_read_sock(sock->sk, &desc, rds_tcp_data_recv);

-- 
Sabrina