Index | Thread | Search

From:
Vitaliy Makkoveev <mvs@openbsd.org>
Subject:
Take `sysctl_lock' before kernel lock
To:
tech@openbsd.org
Date:
Fri, 2 Aug 2024 23:46:58 +0300

Download raw body.

Thread
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