Release solock() before call unp_externalize().
authormvs <mvs@openbsd.org>
Thu, 14 Oct 2021 23:05:10 +0000 (23:05 +0000)
committermvs <mvs@openbsd.org>
Thu, 14 Oct 2021 23:05:10 +0000 (23:05 +0000)
commit936ea052de1ee9a63fc313657b76fb830a2b4a2d
treeb0c98e2a8a45a2d697d5a2e0fc823a439a470a81
parente44725a8dd99f82f94f37ecff5c0e710c4dba97e
Release solock() before call unp_externalize().

A little step forward to make UNIX domain sockets locking fine grained.
The closest goal is to introduce the new rwlock(9) and use it to protect
garbage collector data. This leaves existing `unp_lock' rwlock(9) which
cowers the whole layer for per-socket data only and allows to replace it
with per-socket `so_lock' with further diffs.

Except file descriptor table unp_externalize() operates with the garbage
collector data only such as `unp_rights', `unp_msgcount' directly and
`unp_deferred' through unp_discard(). I want to introduce the new garbage
collector rwlock(9) with the separate diff, so `unp_lock' is still taken
within unp_externalize() around garbage collector data access. But right
now M_WAITOK allocation removed from rwlock(9). Also useless M_WAITOK
allocation and fdplock()/fdpunlock() dances removed from the error path.
The `unp_lock' and fdplock() are not taken together within
unp_externalize() but unp_internalize() still enforces `unp_lock' ->
fdplock() lock order. This rests the only place and will be changed with
the upcoming unp_internalize() and garbage collector rwlock(9) diffs.

ok bluhm@
sys/kern/uipc_socket.c
sys/kern/uipc_usrreq.c