> Date: Mon, 18 Dec 2017 13:30:59 +0100
> From: Martin Pieuchot <m...@openbsd.org>
> 
> This is mostly the membar changes, which are no-op on these archs.
> 
> arm64 also gets some underscores for free.
> 
> ok?

Works for me on arm64; ok kettenis@, although alpha and powerpc should
probably be (compile) tested.

> Index: arch/alpha/alpha/mutex.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/alpha/alpha/mutex.c,v
> retrieving revision 1.19
> diff -u -p -r1.19 mutex.c
> --- arch/alpha/alpha/mutex.c  11 Sep 2017 09:52:15 -0000      1.19
> +++ arch/alpha/alpha/mutex.c  14 Dec 2017 14:49:50 -0000
> @@ -31,7 +31,6 @@
>  #include <sys/atomic.h>
>  
>  #include <machine/intr.h>
> -#include <machine/cpu.h>
>  
>  #include <ddb/db_output.h>
>  
> @@ -88,7 +87,7 @@ __mtx_enter_try(struct mutex *mtx)
>               panic("mtx %p: locking against myself", mtx);
>  #endif
>       if (owner == NULL) {
> -             membar_enter();
> +             membar_enter_after_atomic();
>               if (mtx->mtx_wantipl != IPL_NONE)
>                       mtx->mtx_oldipl = s;
>  #ifdef DIAGNOSTIC
> @@ -144,7 +143,7 @@ __mtx_leave(struct mutex *mtx)
>  
>       s = mtx->mtx_oldipl;
>  #ifdef MULTIPROCESSOR
> -     membar_exit();
> +     membar_exit_before_atomic();
>  #endif
>       mtx->mtx_owner = NULL;
>       if (mtx->mtx_wantipl != IPL_NONE)
> Index: arch/arm64/arm64/arm64_mutex.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/arm64/arm64/arm64_mutex.c,v
> retrieving revision 1.2
> diff -u -p -r1.2 arm64_mutex.c
> --- arch/arm64/arm64/arm64_mutex.c    30 Apr 2017 16:45:45 -0000      1.2
> +++ arch/arm64/arm64/arm64_mutex.c    18 Dec 2017 12:24:24 -0000
> @@ -1,16 +1,17 @@
> -/* $OpenBSD: arm64_mutex.c,v 1.2 2017/04/30 16:45:45 mpi Exp $ */
> +/*   $OpenBSD: mutex.c,v 1.19 2017/09/11 09:52:15 mpi Exp $  */
> +
>  /*
>   * Copyright (c) 2004 Artur Grabowski <a...@openbsd.org>
> - * All rights reserved.
> + * All rights reserved. 
>   *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> + * Redistribution and use in source and binary forms, with or without 
> + * modification, are permitted provided that the following conditions 
> + * are met: 
>   *
> - * 1. Redistributions of source code must retain the above copyright
> - *    notice, this list of conditions and the following disclaimer.
> + * 1. Redistributions of source code must retain the above copyright 
> + *    notice, this list of conditions and the following disclaimer. 
>   * 2. The name of the author may not be used to endorse or promote products
> - *    derived from this software without specific prior written permission.
> + *    derived from this software without specific prior written permission. 
>   *
>   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
>   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
> @@ -21,7 +22,7 @@
>   * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
>   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
> - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
>   */
>  
>  #include <sys/param.h>
> @@ -41,6 +42,7 @@ __mtx_init(struct mutex *mtx, int wantip
>       mtx->mtx_oldipl = IPL_NONE;
>  }
>  
> +#ifdef MULTIPROCESSOR
>  #ifdef MP_LOCKDEBUG
>  #ifndef DDB
>  #error "MP_LOCKDEBUG requires DDB"
> @@ -51,30 +53,32 @@ extern int __mp_lock_spinout;
>  #endif
>  
>  void
> -mtx_enter(struct mutex *mtx)
> +__mtx_enter(struct mutex *mtx)
>  {
>  #ifdef MP_LOCKDEBUG
> -     int ticks = __mp_lock_spinout;
> +     int nticks = __mp_lock_spinout;
>  #endif
>  
> -     while (mtx_enter_try(mtx) == 0) {
> +     while (__mtx_enter_try(mtx) == 0) {
> +             CPU_BUSY_CYCLE();
> +
>  #ifdef MP_LOCKDEBUG
> -             if (--ticks == 0) {
> -                     db_printf("%s(%p): lock spun out", __func__, mtx);
> +             if (--nticks == 0) {
> +                     db_printf("%s: %p lock spun out", __func__, mtx);
>                       db_enter();
> -                     ticks = __mp_lock_spinout;
> +                     nticks = __mp_lock_spinout;
>               }
>  #endif
>       }
>  }
>  
>  int
> -mtx_enter_try(struct mutex *mtx)
> +__mtx_enter_try(struct mutex *mtx)
>  {
>       struct cpu_info *owner, *ci = curcpu();
>       int s;
> -     
> -     if (mtx->mtx_wantipl != IPL_NONE)
> +
> +     if (mtx->mtx_wantipl != IPL_NONE)
>               s = splraise(mtx->mtx_wantipl);
>  
>       owner = atomic_cas_ptr(&mtx->mtx_owner, NULL, ci);
> @@ -83,7 +87,7 @@ mtx_enter_try(struct mutex *mtx)
>               panic("mtx %p: locking against myself", mtx);
>  #endif
>       if (owner == NULL) {
> -             membar_enter();
> +             membar_enter_after_atomic();
>               if (mtx->mtx_wantipl != IPL_NONE)
>                       mtx->mtx_oldipl = s;
>  #ifdef DIAGNOSTIC
> @@ -97,9 +101,37 @@ mtx_enter_try(struct mutex *mtx)
>  
>       return (0);
>  }
> +#else
> +void
> +__mtx_enter(struct mutex *mtx)
> +{
> +     struct cpu_info *ci = curcpu();
> +
> +#ifdef DIAGNOSTIC
> +     if (__predict_false(mtx->mtx_owner == ci))
> +             panic("mtx %p: locking against myself", mtx);
> +#endif
> +
> +     if (mtx->mtx_wantipl != IPL_NONE)
> +             mtx->mtx_oldipl = splraise(mtx->mtx_wantipl);
> +
> +     mtx->mtx_owner = ci;
> +
> +#ifdef DIAGNOSTIC
> +     ci->ci_mutex_level++;
> +#endif
> +}
> +
> +int
> +__mtx_enter_try(struct mutex *mtx)
> +{
> +     __mtx_enter(mtx);
> +     return (1);
> +}
> +#endif
>  
>  void
> -mtx_leave(struct mutex *mtx)
> +__mtx_leave(struct mutex *mtx)
>  {
>       int s;
>  
> @@ -111,7 +143,7 @@ mtx_leave(struct mutex *mtx)
>  
>       s = mtx->mtx_oldipl;
>  #ifdef MULTIPROCESSOR
> -     membar_exit();
> +     membar_exit_before_atomic();
>  #endif
>       mtx->mtx_owner = NULL;
>       if (mtx->mtx_wantipl != IPL_NONE)
> Index: arch/mips64/mips64/mutex.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/mips64/mips64/mutex.c,v
> retrieving revision 1.7
> diff -u -p -r1.7 mutex.c
> --- arch/mips64/mips64/mutex.c        11 Sep 2017 09:52:15 -0000      1.7
> +++ arch/mips64/mips64/mutex.c        14 Dec 2017 14:49:49 -0000
> @@ -87,7 +87,7 @@ __mtx_enter_try(struct mutex *mtx)
>               panic("mtx %p: locking against myself", mtx);
>  #endif
>       if (owner == NULL) {
> -             membar_enter();
> +             membar_enter_after_atomic();
>               if (mtx->mtx_wantipl != IPL_NONE)
>                       mtx->mtx_oldipl = s;
>  #ifdef DIAGNOSTIC
> @@ -143,7 +143,7 @@ __mtx_leave(struct mutex *mtx)
>  
>       s = mtx->mtx_oldipl;
>  #ifdef MULTIPROCESSOR
> -     membar_exit();
> +     membar_exit_before_atomic();
>  #endif
>       mtx->mtx_owner = NULL;
>       if (mtx->mtx_wantipl != IPL_NONE)
> Index: arch/powerpc/powerpc/mutex.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/powerpc/powerpc/mutex.c,v
> retrieving revision 1.7
> diff -u -p -r1.7 mutex.c
> --- arch/powerpc/powerpc/mutex.c      11 Sep 2017 09:52:15 -0000      1.7
> +++ arch/powerpc/powerpc/mutex.c      14 Dec 2017 14:48:50 -0000
> @@ -31,7 +31,6 @@
>  #include <sys/atomic.h>
>  
>  #include <machine/intr.h>
> -#include <machine/cpu.h>
>  
>  #include <ddb/db_output.h>
>  
> @@ -88,7 +87,7 @@ __mtx_enter_try(struct mutex *mtx)
>               panic("mtx %p: locking against myself", mtx);
>  #endif
>       if (owner == NULL) {
> -             membar_enter();
> +             membar_enter_after_atomic();
>               if (mtx->mtx_wantipl != IPL_NONE)
>                       mtx->mtx_oldipl = s;
>  #ifdef DIAGNOSTIC
> @@ -144,7 +143,7 @@ __mtx_leave(struct mutex *mtx)
>  
>       s = mtx->mtx_oldipl;
>  #ifdef MULTIPROCESSOR
> -     membar_exit();
> +     membar_exit_before_atomic();
>  #endif
>       mtx->mtx_owner = NULL;
>       if (mtx->mtx_wantipl != IPL_NONE)
> 
> 

Reply via email to