kbind(2): unlock syscall, push kernel lock down to binding loop
authorcheloha <cheloha@openbsd.org>
Mon, 27 Jun 2022 14:26:05 +0000 (14:26 +0000)
committercheloha <cheloha@openbsd.org>
Mon, 27 Jun 2022 14:26:05 +0000 (14:26 +0000)
commit52dd74b4de497591ffc2ca410cce842d712115e4
tree29cbc5599151280f4e5f877cf5059692faca0ba1
parent696e08bcd9dfe934f7f2605da95173c5bdc360ca
kbind(2): unlock syscall, push kernel lock down to binding loop

- Rearrange the security check code in sys_kbind() so that we only
  need to take the kernel lock once if we need to raise SIGILL.

- Protect process.ps_kbind_addr and process.ps_kbind_cookie with
  process.ps_mtx.  This is easier to do after the aforementioned
  rearrangement.  Under normal circumstances this isn't necessary:
  the process is single-threaded when we initialize kbind(2).
  But in stranger situations this brief mutex ensures that the
  first thread to reach sys_kbind() initializes both variables.

- Wrap the binding loop with the kernel lock.  We need to carefully
  confirm that uvm_unmap_remove(), uvm_map_extract(), and
  uvm_unmap_detach() are MP-safe in a subsequent patch before
  completely removing the kernel lock from sys_kbind().

- Remove the kernel lock from kbind(2) in syscalls.master.

Prompted by mpi@, dlg@, and deraadt@.  Current patch workshopped with
deraadt@.  Based on a patch from dlg@.

With input from dlg@, bluhm@, mpi@, kettenis@, deraadt@, and
guenther@.

Thread: https://marc.info/?l=openbsd-tech&m=165274831829349&w=2

ok deraadt@ kettenis@ mpi@
sys/kern/init_sysent.c
sys/kern/syscalls.master
sys/sys/proc.h
sys/sys/syscall.h
sys/sys/syscallargs.h
sys/uvm/uvm_mmap.c