replace hand rolled tsleep physlock with rwlock. ok mlarkin
authortedu <tedu@openbsd.org>
Tue, 16 Aug 2016 18:17:36 +0000 (18:17 +0000)
committertedu <tedu@openbsd.org>
Tue, 16 Aug 2016 18:17:36 +0000 (18:17 +0000)
sys/arch/arm/arm/mem.c
sys/arch/sparc/sparc/mem.c
sys/arch/sparc64/sparc64/mem.c

index 9d09331..9c636f8 100644 (file)
@@ -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);
 }
index 8cbbacd..24c67af 100644 (file)
@@ -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);
 }
index 3261581..7e21614 100644 (file)
@@ -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);
 }