From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Mon, 22 Nov 2010 12:10:49 -0800 From: Andrew Morton Subject: Re: [PATCH] mutex: Introduce arch_mutex_cpu_relax() Message-Id: <20101122121049.01c4690a.akpm@linux-foundation.org> In-Reply-To: <1290437256.7455.4.camel@thinkpad> References: <1290437256.7455.4.camel@thinkpad> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-Archive: List-Post: To: gerald.schaefer@de.ibm.com Cc: Peter Zijlstra , Ingo Molnar , Martin Schwidefsky , LKML , linux-s390 , Heiko Carstens List-ID: On Mon, 22 Nov 2010 15:47:36 +0100 Gerald Schaefer wrote: > From: Gerald Schaefer > > 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 > arch_mutex_cpu_relax(), which can be defined by each architecture that > selects HAVE_ARCH_MUTEX_CPU_RELAX. The default is still cpu_relax(), so > this patch should not affect other architectures than System z for now. > > ... > > --- 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_ARCH_MUTEX_CPU_RELAX > +#define arch_mutex_cpu_relax() cpu_relax() > +#endif A simpler way of doing this is to remove the CONFIG_ variable altogether and do #ifndef arch_mutex_cpu_relax #define arch_mutex_cpu_relax() cpu_relax() #endif When doing this, one should be clear about _which_ arch file has the responsibility of defining arch_mutex_cpu_relax, and make sure that this arch file is reliably included in the .c file.