Use sorflush() instead of direct unp_scan(..., unp_discard) to discard
authormvs <mvs@openbsd.org>
Fri, 22 Mar 2024 17:34:11 +0000 (17:34 +0000)
committermvs <mvs@openbsd.org>
Fri, 22 Mar 2024 17:34:11 +0000 (17:34 +0000)
commitfdada4b1d06e7ba496cc0badc521a16b3635267a
tree66ef7498cea9b258732d50bbd8c59b93c4c8c3b9
parenteff7ddaf5345d364fff16bd60943172a70fced85
Use sorflush() instead of direct unp_scan(..., unp_discard) to discard
dead unix(4) sockets.

The difference in direct unp_scan() and sorflush() is the mbuf(9) chain.
For the first case it is still linked to the `so_rcv', for the second it
is not. This is required to make `sb_mtx' mutex(9) the only `so_rcv'
sockbuf protection and remove socket re-locking from the most of
uipc_*send() paths. The unlinked mbuf(9) chain doesn't require any
protection, so this allows to perform sleeping unp_discard() lockless.

Also, the mbuf(9) chain of the discarded socket still contains addresses
of file descriptors and it is much safer to unlink it before FRELE()
them. This is the reason to commit this diff standalone.

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