Rework socket buffers locking for shared netlock.
authormvs <mvs@openbsd.org>
Sat, 3 Feb 2024 22:50:08 +0000 (22:50 +0000)
committermvs <mvs@openbsd.org>
Sat, 3 Feb 2024 22:50:08 +0000 (22:50 +0000)
commit104c0a839baf7bd73dd7cb6df3321bb307c53da5
treecd83bfe429ff5520ffd836bfc42bb684f1990562
parent25efc16951b0bbf3f2e66db54e266affb1449084
Rework socket buffers locking for shared netlock.

Shared netlock is not sufficient to call so{r,w}wakeup(). The following
sowakeup() modifies `sb_flags' and knote(9) stuff. Unfortunately, we
can't call so{r,w}wakeup() with `inp_mtx' mutex(9) because sowakeup()
also calls pgsigio() which grabs kernel lock.

However, `so*_filtops' callbacks only perform read-only access to the
socket stuff, so it is enough to hold shared netlock only, but the klist
stuff needs to be protected.

This diff introduces `sb_mtx' mutex(9) to protect sockbuf. This time
`sb_mtx' used to protect only `sb_flags' and `sb_klist'.

Now we have soassertlocked_readonly() and soassertlocked(). The first
one is happy if only shared netlock is held, meanwhile the second wants
`so_lock' or pru_lock() be held together with shared netlock.

To keep soassertlocked*() assertions soft, we need to know mutex(9)
state, so new mtx_owned() macro was introduces. Also, the new optional
(*pru_locked)() handler brings the state of pru_lock().

Tests and ok from bluhm.
17 files changed:
sys/kern/uipc_socket.c
sys/kern/uipc_socket2.c
sys/kern/uipc_syscalls.c
sys/miscfs/fifofs/fifo_vnops.c
sys/netinet/ip_divert.c
sys/netinet/ip_divert.h
sys/netinet/ip_var.h
sys/netinet/raw_ip.c
sys/netinet/udp_usrreq.c
sys/netinet/udp_var.h
sys/netinet6/ip6_divert.c
sys/netinet6/ip6_mroute.c
sys/netinet6/ip6_var.h
sys/netinet6/raw_ip6.c
sys/sys/mutex.h
sys/sys/protosw.h
sys/sys/socketvar.h