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);
>  }
> 

Reply via email to