> Date: Mon, 18 Dec 2017 13:30:59 +0100
> From: Martin Pieuchot <[email protected]>
>
> 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 <[email protected]>
> - * 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)
>
>