Turn sblock() to `sb_lock' rwlock(9) wrapper for all sockets.
authormvs <mvs@openbsd.org>
Fri, 17 May 2024 19:11:14 +0000 (19:11 +0000)
committermvs <mvs@openbsd.org>
Fri, 17 May 2024 19:11:14 +0000 (19:11 +0000)
commit9953a406230a5ded9465bc4125ef8001aad0bff0
tree3b9ad523fc23680123e14f5314bc1e555e5a2ced
parent150eb84f66c07baaf405d8280c110fae0660af26
Turn sblock() to `sb_lock' rwlock(9) wrapper for all sockets.

Unify behaviour to all sockets. Now sblock() should be always
taken before solock() in all involved paths as sosend(), soreceive(),
sorflush() and sosplice(). sblock() is fine-grained lock which
serializes socket send and receive routines on `so_rcv' or `so_snd'
buffers. There is no big problem to wait netlock while holding sblock().

This unification removes a lot of temporary "sb_flags & SB_MTXLOCK" code
from sockets layer. This unification makes straight "solock()" and
"sblock()" lock order, no more solock() -> sblock() -> sounlock() ->
solock() -> sbunlock() -> sounlock() chains in sosend() and soreceive()
paths. This unification brings witness(4) support for sblock(), include
NFS involved sockets, which is useful.

Since the witness(4) support was introduced to sblock() with this diff,
some new witness reports appeared.

bulk(1) tests by tb, ok bluhm
sys/kern/uipc_socket.c
sys/kern/uipc_socket2.c
sys/sys/socketvar.h