Download raw body.
Take `sysctl_lock' before kernel lock
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
Take `sysctl_lock' before kernel lock