From f9cb710378989bd945b847693a39475a74af878e Mon Sep 17 00:00:00 2001 From: Ted Unangst <tedu@cvs.openbsd.org> Date: Tue, 16 Aug 2016 18:17:37 +0000 Subject: replace hand rolled tsleep physlock with rwlock. ok mlarkin --- sys/arch/arm/arm/mem.c | 21 ++++++++------------- sys/arch/sparc/sparc/mem.c | 20 +++++++------------- sys/arch/sparc64/sparc64/mem.c | 20 +++++++------------- 3 files changed, 22 insertions(+), 39 deletions(-) (limited to 'sys/arch') diff --git a/sys/arch/arm/arm/mem.c b/sys/arch/arm/arm/mem.c index 9d09331fbbd..9c636f8cfc6 100644 --- a/sys/arch/arm/arm/mem.c +++ b/sys/arch/arm/arm/mem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mem.c,v 1.16 2016/08/15 22:01:59 tedu Exp $ */ +/* $OpenBSD: mem.c,v 1.17 2016/08/16 18:17:36 tedu Exp $ */ /* $NetBSD: mem.c,v 1.11 2003/10/16 12:02:58 jdolecek Exp $ */ /* @@ -81,6 +81,7 @@ #include <sys/malloc.h> #include <sys/proc.h> #include <sys/fcntl.h> +#include <sys/rwlock.h> #include <machine/cpu.h> #include <arm/conf.h> @@ -89,7 +90,6 @@ extern char *memhook; /* poor name! */ caddr_t zeropage; -int physlock; /* open counter for aperture */ #ifdef APERTURE @@ -142,6 +142,7 @@ mmclose(dev_t dev, int flag, int mode, struct proc *p) int mmrw(dev_t dev, struct uio *uio, int flags) { + static struct rwlock physlock = RWLOCK_INITIALIZER("mmrw"); vaddr_t o, v; size_t c; struct iovec *iov; @@ -150,14 +151,10 @@ mmrw(dev_t dev, struct uio *uio, int flags) if (minor(dev) == DEV_MEM) { /* lock against other uses of shared vmmap */ - while (physlock > 0) { - physlock++; - error = tsleep((caddr_t)&physlock, PZERO | PCATCH, - "mmrw", 0); - if (error) - return (error); - } - physlock = 1; + error = rw_enter(&physlock, RW_WRITE | RW_INTR); + if (error) + return (error); + } while (uio->uio_resid > 0 && error == 0) { iov = uio->uio_iov; @@ -216,9 +213,7 @@ mmrw(dev_t dev, struct uio *uio, int flags) } } if (minor(dev) == DEV_MEM) { - if (physlock > 1) - wakeup((caddr_t)&physlock); - physlock = 0; + rw_exit(&physlock); } return (error); } diff --git a/sys/arch/sparc/sparc/mem.c b/sys/arch/sparc/sparc/mem.c index 8cbbacd421b..24c67af9624 100644 --- a/sys/arch/sparc/sparc/mem.c +++ b/sys/arch/sparc/sparc/mem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mem.c,v 1.27 2016/08/15 22:01:59 tedu Exp $ */ +/* $OpenBSD: mem.c,v 1.28 2016/08/16 18:17:36 tedu Exp $ */ /* $NetBSD: mem.c,v 1.13 1996/03/30 21:12:16 christos Exp $ */ /* @@ -47,6 +47,7 @@ #include <sys/uio.h> #include <sys/malloc.h> #include <sys/proc.h> +#include <sys/rwlock.h> #include <sys/conf.h> #include <sparc/sparc/vaddrs.h> @@ -86,24 +87,19 @@ mmclose(dev_t dev, int flag, int mode, struct proc *p) int mmrw(dev_t dev, struct uio *uio, int flags) { + static struct rwlock physlock = RWLOCK_INITIALIZER("mmrw"); off_t o; paddr_t pa; vaddr_t va; size_t c; struct iovec *iov; int error = 0; - static int physlock; if (minor(dev) == 0) { /* lock against other uses of shared mem_page */ - while (physlock > 0) { - physlock++; - error = tsleep((caddr_t)&physlock, PZERO | PCATCH, - "mmrw", 0); - if (error) - return (error); - } - physlock = 1; + error = rw_enter(&physlock, RW_WRITE | RW_INTR); + if (error) + return (error); if (mem_page == 0) mem_page = uvm_km_valloc_wait(kernel_map, NBPG); if (mem_page == 0) @@ -193,9 +189,7 @@ mmrw(dev_t dev, struct uio *uio, int flags) } if (minor(dev) == 0) { unlock: - if (physlock > 1) - wakeup((caddr_t)&physlock); - physlock = 0; + rw_exit(&physlock); } return (error); } diff --git a/sys/arch/sparc64/sparc64/mem.c b/sys/arch/sparc64/sparc64/mem.c index 32615817070..7e21614180f 100644 --- a/sys/arch/sparc64/sparc64/mem.c +++ b/sys/arch/sparc64/sparc64/mem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mem.c,v 1.16 2016/08/15 22:01:59 tedu Exp $ */ +/* $OpenBSD: mem.c,v 1.17 2016/08/16 18:17:36 tedu Exp $ */ /* $NetBSD: mem.c,v 1.18 2001/04/24 04:31:12 thorpej Exp $ */ /* @@ -47,6 +47,7 @@ #include <sys/uio.h> #include <sys/malloc.h> #include <sys/proc.h> +#include <sys/rwlock.h> #include <sys/conf.h> #include <machine/conf.h> @@ -75,24 +76,19 @@ mmclose(dev_t dev, int flag, int mode, struct proc *p) int mmrw(dev_t dev, struct uio *uio, int flags) { + static struct rwlock physlock = RWLOCK_INITIALIZER("mmrw"); vaddr_t o, v; size_t c; struct iovec *iov; int error = 0; - static int physlock; vm_prot_t prot; extern caddr_t vmmap; if (minor(dev) == 0) { /* lock against other uses of shared vmmap */ - while (physlock > 0) { - physlock++; - error = tsleep((caddr_t)&physlock, PZERO | PCATCH, - "mmrw", 0); - if (error) - return (error); - } - physlock = 1; + error = rw_enter(&physlock, RW_WRITE | RW_INTR); + if (error) + return (error); } while (uio->uio_resid > 0 && error == 0) { int n; @@ -169,9 +165,7 @@ mmrw(dev_t dev, struct uio *uio, int flags) } if (minor(dev) == 0) { unlock: - if (physlock > 1) - wakeup((caddr_t)&physlock); - physlock = 0; + rw_exit(&physlock); } return (error); } -- cgit v1.2.3