On Thu, 2010-10-14 at 15:13 -0700, Andrew Morton wrote: > On Thu, 14 Oct 2010 19:40:25 +0200 > Gerald Schaefer <gerald.schaefer@xxxxxxxxxx> wrote: > > > From: Gerald Schaefer <gerald.schaefer@xxxxxxxxxx> > > > > The spinning mutex implementation uses cpu_relax() in busy loops as a > > compiler barrier. Depending on the architecture, cpu_relax() may do more > > than needed in this specific mutex spin loops. On System z we also give > > up the time slice of the virtual cpu in cpu_relax(), which prevents > > effective spinning on the mutex. > > > > This patch replaces cpu_relax() in the spinning mutex code with a new > > function mutex_cpu_relax(), which can be defined by each architecture > > that selects HAVE_MUTEX_CPU_RELAX. The default is still cpu_relax(), so > > this patch should not affect other architectures than System z for now. > > > > Signed-off-by: Gerald Schaefer <gerald.schaefer@xxxxxxxxxx> > > --- > > arch/Kconfig | 3 +++ > > arch/s390/Kconfig | 1 + > > arch/s390/include/asm/mutex.h | 2 ++ > > include/linux/mutex.h | 4 ++++ > > kernel/mutex.c | 2 +- > > kernel/sched.c | 2 +- > > 6 files changed, 12 insertions(+), 2 deletions(-) > > > > --- a/arch/Kconfig > > +++ b/arch/Kconfig > > @@ -158,4 +158,7 @@ config HAVE_PERF_EVENTS_NMI > > subsystem. Also has support for calculating CPU cycle events > > to determine how many clock cycles in a given period. > > > > +config HAVE_MUTEX_CPU_RELAX > > + bool > > + > > source "kernel/gcov/Kconfig" > > --- a/arch/s390/Kconfig > > +++ b/arch/s390/Kconfig > > @@ -100,6 +100,7 @@ config S390 > > select HAVE_KERNEL_BZIP2 > > select HAVE_KERNEL_LZMA > > select HAVE_KERNEL_LZO > > + select HAVE_MUTEX_CPU_RELAX > > select ARCH_INLINE_SPIN_TRYLOCK > > select ARCH_INLINE_SPIN_TRYLOCK_BH > > select ARCH_INLINE_SPIN_LOCK > > We could just omit the HAVE_MUTEX_CPU_RELAX > > > --- a/arch/s390/include/asm/mutex.h > > +++ b/arch/s390/include/asm/mutex.h > > @@ -7,3 +7,5 @@ > > */ > > > > #include <asm-generic/mutex-dec.h> > > + > > +#define mutex_cpu_relax() barrier() > > --- a/include/linux/mutex.h > > +++ b/include/linux/mutex.h > > @@ -160,4 +160,8 @@ extern int mutex_trylock(struct mutex *l > > extern void mutex_unlock(struct mutex *lock); > > extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); > > > > +#ifndef CONFIG_HAVE_MUTEX_CPU_RELAX > > +#define mutex_cpu_relax() cpu_relax() > > +#endif > > and do `#ifndef mutex_cpu_relax' here. That's a pretty common trick. > It's best to add a comment telling people which arch header file should > define mutex_cpu_relax, so everyone does it the same way. > > It should perhaps be called arch_mutex_cpu_relax(). Nice trick, I'll send a new patch. -- To unsubscribe from this list: send the line "unsubscribe linux-s390" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html