Index | Thread | Search

From:
Vitaliy Makkoveev <mvs@openbsd.org>
Subject:
sysctl(2): unlock `uvm_wxabort'
To:
Martin Pieuchot <mpi@openbsd.org>, tech@openbsd.org
Date:
Sat, 14 Dec 2024 10:16:32 +0300

Download raw body.

Thread
  • Vitaliy Makkoveev:

    sysctl(2): unlock `uvm_wxabort'

It is atomically accessed boolean integer. uvm_wxcheck() already loads
it lockless.

Index: sys/kern/kern_sysctl.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
diff -u -p -r1.455 kern_sysctl.c
--- sys/kern/kern_sysctl.c	18 Nov 2024 08:42:53 -0000	1.455
+++ sys/kern/kern_sysctl.c	14 Dec 2024 07:09:04 -0000
@@ -598,6 +598,7 @@ kern_sysctl(int *name, u_int namelen, vo
 	case KERN_FSCALE:
 	case KERN_CCPU:
 	case KERN_NPROCS:
+	case KERN_WXABORT:
 	case KERN_NETLIVELOCKS:
 	case KERN_AUTOCONF_SERIAL:
 		return (sysctl_bounded_arr(kern_vars, nitems(kern_vars), name,
Index: sys/uvm/uvm_mmap.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_mmap.c,v
diff -u -p -r1.192 uvm_mmap.c
--- sys/uvm/uvm_mmap.c	21 Aug 2024 03:07:45 -0000	1.192
+++ sys/uvm/uvm_mmap.c	14 Dec 2024 07:09:04 -0000
@@ -75,6 +75,11 @@
 #include <uvm/uvm_device.h>
 #include <uvm/uvm_vnode.h>
 
+/*
+ * Locks used to protect data:
+ *	a	atomic
+ */
+
 int uvm_mmapanon(vm_map_t, vaddr_t *, vsize_t, vm_prot_t, vm_prot_t, int,
     vsize_t, struct proc *);
 int uvm_mmapfile(vm_map_t, vaddr_t *, vsize_t, vm_prot_t, vm_prot_t, int,
@@ -163,7 +168,7 @@ sys_mquery(struct proc *p, void *v, regi
 	return error;
 }
 
-int	uvm_wxabort;
+int	uvm_wxabort;	/* [a] */
 
 /*
  * W^X violations are only allowed on permitted filesystems.
@@ -178,7 +183,7 @@ uvm_wxcheck(struct proc *p, char *call)
 	if (wxallowed && (pr->ps_flags & PS_WXNEEDED))
 		return 0;
 
-	if (uvm_wxabort) {
+	if (atomic_load_int(&uvm_wxabort)) {
 		KERNEL_LOCK();
 		/* Report W^X failures */
 		if (pr->ps_wxcounter++ == 0)