From: Vitaliy Makkoveev Subject: Take `sysctl_lock' before kernel lock To: tech@openbsd.org Date: Fri, 2 Aug 2024 23:46:58 +0300 It's better to wait system-wide kernel lock acquisition after local `sysctl_lock'. Index: sys/kern/kern_sysctl.c =================================================================== RCS file: /cvs/src/sys/kern/kern_sysctl.c,v diff -u -p -r1.430 kern_sysctl.c --- sys/kern/kern_sysctl.c 2 Aug 2024 14:34:45 -0000 1.430 +++ sys/kern/kern_sysctl.c 2 Aug 2024 15:31:34 -0000 @@ -172,26 +172,25 @@ sysctl_vslock(void *addr, size_t len) { int error; - KERNEL_LOCK(); error = rw_enter(&sysctl_lock, RW_WRITE|RW_INTR); if (error) - goto out; + return error; + KERNEL_LOCK(); if (addr) { if (atop(len) > uvmexp.wiredmax - uvmexp.wired) { error = ENOMEM; - goto out2; + goto out; } error = uvm_vslock(curproc, addr, len, PROT_READ | PROT_WRITE); if (error) - goto out2; + goto out; } return (0); -out2: - rw_exit_write(&sysctl_lock); out: KERNEL_UNLOCK(); + rw_exit_write(&sysctl_lock); return (error); } @@ -202,8 +201,8 @@ sysctl_vsunlock(void *addr, size_t len) if (addr) uvm_vsunlock(curproc, addr, len); - rw_exit_write(&sysctl_lock); KERNEL_UNLOCK(); + rw_exit_write(&sysctl_lock); } int