Remove `head' socket re-locking in sonewconn().
authormvs <mvs@openbsd.org>
Wed, 10 Apr 2024 12:04:41 +0000 (12:04 +0000)
committermvs <mvs@openbsd.org>
Wed, 10 Apr 2024 12:04:41 +0000 (12:04 +0000)
commitb11de491e7642ff96b344b5e0fd0a31b38d30d87
tree833696ac3f6abe828193acfa8ec0028daef9b052
parent4221ed92fa522b9b8ed80a6f17a8655fe197a8aa
Remove `head' socket re-locking in sonewconn().

uipc_attach() releases solock() because it should be taken after
`unp_gc_lock' rwlock(9) which protects the `unp_link' list. For this
reason, the listening `head' socket should be unlocked too while
sonewconn() calls uipc_attach(). This could be reworked because now
`so_rcv' sockbuf relies on `sb_mtx' mutex(9).

The last one `unp_link' foreach loop within unp_gc() discards sockets
previously marked as UNP_GCDEAD. These sockets are not accessed from the
userland. The only exception is the sosend() threads of connected
sending peers, but they only sbappend*() mbuf(9) to `so_rcv'. So it's
enough to unlink mbuf(9) chain with `sb_mtx' held and discard lockless.

Please note, the existing SS_NEWCONN_WAIT logic was never used because
the listening unix(4) socket protected from concurrent unp_detach() by
vnode(9) lock, however `head' re-locked all times.

ok bluhm
sys/kern/uipc_socket.c
sys/kern/uipc_socket2.c
sys/kern/uipc_usrreq.c
sys/sys/socketvar.h