From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Paul E. McKenney" Subject: Re: [PATCH v7 2/4] qrwlock x86: Enable x86 to use queue read/write lock Date: Tue, 17 Dec 2013 11:22:37 -0800 Message-ID: <20131217192236.GB15969@linux.vnet.ibm.com> References: <1385147087-26588-1-git-send-email-Waiman.Long@hp.com> <1385147087-26588-3-git-send-email-Waiman.Long@hp.com> Reply-To: paulmck@linux.vnet.ibm.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from e34.co.us.ibm.com ([32.97.110.152]:55542 "EHLO e34.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751800Ab3LQTWn (ORCPT ); Tue, 17 Dec 2013 14:22:43 -0500 Received: from /spool/local by e34.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 17 Dec 2013 12:22:43 -0700 Content-Disposition: inline In-Reply-To: <1385147087-26588-3-git-send-email-Waiman.Long@hp.com> Sender: linux-arch-owner@vger.kernel.org List-ID: To: Waiman Long Cc: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Arnd Bergmann , linux-arch@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, Peter Zijlstra , Steven Rostedt , Andrew Morton , Michel Lespinasse , Andi Kleen , Rik van Riel , Linus Torvalds , Raghavendra K T , George Spelvin , Tim Chen , "Aswin Chandramouleeswaran\"" , Scott J Norton On Fri, Nov 22, 2013 at 02:04:45PM -0500, Waiman Long wrote: > This patch makes the necessary changes at the x86 architecture specific > layer to enable the presence of the CONFIG_QUEUE_RWLOCK kernel option > to replace the read/write lock by the queue read/write lock. > > It also enables the CONFIG_QUEUE_RWLOCK option by default for x86 which > will force the use of queue read/write lock. That will greatly improve > the fairness of read/write lock and eliminate live-lock situation > where one task may not get the lock for an indefinite period of time. > > Signed-off-by: Waiman Long Reviewed-by: Paul E. McKenney > --- > arch/x86/Kconfig | 1 + > arch/x86/include/asm/spinlock.h | 2 ++ > arch/x86/include/asm/spinlock_types.h | 4 ++++ > 3 files changed, 7 insertions(+), 0 deletions(-) > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > index e903c71..c4a9c54 100644 > --- a/arch/x86/Kconfig > +++ b/arch/x86/Kconfig > @@ -124,6 +124,7 @@ config X86 > select RTC_LIB > select HAVE_DEBUG_STACKOVERFLOW > select HAVE_IRQ_EXIT_ON_IRQ_STACK if X86_64 > + select QUEUE_RWLOCK > > config INSTRUCTION_DECODER > def_bool y > diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h > index bf156de..8fb88c5 100644 > --- a/arch/x86/include/asm/spinlock.h > +++ b/arch/x86/include/asm/spinlock.h > @@ -188,6 +188,7 @@ static inline void arch_spin_unlock_wait(arch_spinlock_t *lock) > cpu_relax(); > } > > +#ifndef CONFIG_QUEUE_RWLOCK > /* > * Read-write spinlocks, allowing multiple readers > * but only one writer. > @@ -270,6 +271,7 @@ static inline void arch_write_unlock(arch_rwlock_t *rw) > asm volatile(LOCK_PREFIX WRITE_LOCK_ADD(%1) "%0" > : "+m" (rw->write) : "i" (RW_LOCK_BIAS) : "memory"); > } > +#endif /* CONFIG_QUEUE_RWLOCK */ > > #define arch_read_lock_flags(lock, flags) arch_read_lock(lock) > #define arch_write_lock_flags(lock, flags) arch_write_lock(lock) > diff --git a/arch/x86/include/asm/spinlock_types.h b/arch/x86/include/asm/spinlock_types.h > index 4f1bea1..a585635 100644 > --- a/arch/x86/include/asm/spinlock_types.h > +++ b/arch/x86/include/asm/spinlock_types.h > @@ -34,6 +34,10 @@ typedef struct arch_spinlock { > > #define __ARCH_SPIN_LOCK_UNLOCKED { { 0 } } > > +#ifdef CONFIG_QUEUE_RWLOCK > +#include > +#else > #include > +#endif > > #endif /* _ASM_X86_SPINLOCK_TYPES_H */ > -- > 1.7.1 >