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