From: Vitaliy Makkoveev Subject: sysctl(2): unlock `uvm_wxabort' To: Martin Pieuchot , tech@openbsd.org Date: Sat, 14 Dec 2024 10:16:32 +0300 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 #include +/* + * 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)