Use `sb_mtx' instead of `inp_mtx' in receive path for inet sockets.
authormvs <mvs@openbsd.org>
Sun, 11 Feb 2024 18:14:26 +0000 (18:14 +0000)
committermvs <mvs@openbsd.org>
Sun, 11 Feb 2024 18:14:26 +0000 (18:14 +0000)
commitc75e434f6f5f50f8d08d05b4de43650989a1e128
treec3d7c462f480a557ad1bdd9bb6c9f9fe5da90f27
parent8cff70dd7f9ae4b7290bc90cf5505ae9a5b6479a
Use `sb_mtx' instead of `inp_mtx' in receive path for inet sockets.

In soreceve(), we only touch `so_rcv' socket buffer, which has it's own
`sb_mtx' mutex(9) for protection. So, we can avoid solock() in this
path - it's enough to hold `sb_mtx' in soreceive() and around
corresponding sbappend*(). But not right now :)

This time we use shared netlock for some inet sockets in the soreceive()
path. To protect `so_rcv' buffer we use `inp_mtx' mutex(9) and the
pru_lock() to acquire this mutex(9) in socket layer. But the `inp_mtx'
mutex belongs to the PCB. We initialize socket before PCB, tcp(4)
sockets could exist without PCB, so use `sb_mtx' mutex(9) to protect
sockbuf stuff.

This diff mechanically replaces `inp_mtx' by `sb_mtx' in the receive
path. Only for sockets which already use `inp_mtx'. All other sockets
left as is. They will be converted later.

Since the `sb_mtx' is optional, the new SB_MTXLOCK flag introduced. If
this flag is set on `sb_flags', the `sb_mtx' mutex(9) should be taken.
New sb_mtx_lock() and sb_mtx_unlock() was introduced to hide this check.
They are temporary and will be replaced by mtx_enter() when all this
area will be converted to `sb_mtx' mutex(9).

Also, the new sbmtxassertlocked() function introduced to throw
corresponding assertion for SB_MTXLOCK marked buffers. This time only
sbappendaddr() calls it. This function is also temporary and will be
replaced by MTX_ASSERT_LOCKED() later.

ok bluhm
sys/kern/uipc_socket.c
sys/kern/uipc_socket2.c
sys/netinet/ip_divert.c
sys/netinet/ip_mroute.c
sys/netinet/raw_ip.c
sys/netinet/udp_usrreq.c
sys/netinet6/ip6_divert.c
sys/netinet6/ip6_mroute.c
sys/netinet6/raw_ip6.c
sys/sys/socketvar.h