On Mon, Aug 15, 2016 at 06:10:55PM -0400, Ted Unangst wrote: > same change as for i386, but now for arm and sparcs. >
ok mlarkin > Index: arm/arm/mem.c > =================================================================== > RCS file: /cvs/src/sys/arch/arm/arm/mem.c,v > retrieving revision 1.16 > diff -u -p -r1.16 mem.c > --- arm/arm/mem.c 15 Aug 2016 22:01:59 -0000 1.16 > +++ arm/arm/mem.c 15 Aug 2016 22:10:03 -0000 > @@ -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, s > 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 fla > > 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 fla > } > } > if (minor(dev) == DEV_MEM) { > - if (physlock > 1) > - wakeup((caddr_t)&physlock); > - physlock = 0; > + rw_exit(&physlock); > } > return (error); > } > Index: sparc/sparc/mem.c > =================================================================== > RCS file: /cvs/src/sys/arch/sparc/sparc/mem.c,v > retrieving revision 1.27 > diff -u -p -r1.27 mem.c > --- sparc/sparc/mem.c 15 Aug 2016 22:01:59 -0000 1.27 > +++ sparc/sparc/mem.c 15 Aug 2016 22:10:03 -0000 > @@ -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, s > 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 fla > } > if (minor(dev) == 0) { > unlock: > - if (physlock > 1) > - wakeup((caddr_t)&physlock); > - physlock = 0; > + rw_exit(&physlock); > } > return (error); > } > Index: sparc64/sparc64/mem.c > =================================================================== > RCS file: /cvs/src/sys/arch/sparc64/sparc64/mem.c,v > retrieving revision 1.16 > diff -u -p -r1.16 mem.c > --- sparc64/sparc64/mem.c 15 Aug 2016 22:01:59 -0000 1.16 > +++ sparc64/sparc64/mem.c 15 Aug 2016 22:10:03 -0000 > @@ -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, s > 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 fla > } > if (minor(dev) == 0) { > unlock: > - if (physlock > 1) > - wakeup((caddr_t)&physlock); > - physlock = 0; > + rw_exit(&physlock); > } > return (error); > } >