From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752723Ab3HAChg (ORCPT ); Wed, 31 Jul 2013 22:37:36 -0400 Received: from g5t0007.atlanta.hp.com ([15.192.0.44]:45552 "EHLO g5t0007.atlanta.hp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751156Ab3HAChd (ORCPT ); Wed, 31 Jul 2013 22:37:33 -0400 From: Waiman Long Cc: Waiman Long , linux-arch@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, Peter Zijlstra , Steven Rostedt , Andrew Morton , Richard Weinberger , Catalin Marinas , Greg Kroah-Hartman , Matt Fleming , Herbert Xu , Akinobu Mita , Rusty Russell , Michel Lespinasse , Andi Kleen , Rik van Riel , "Paul E. McKenney" , Linus Torvalds , Raghavendra K T , George Spelvin , Harvey Harrison , "Chandramouleeswaran, Aswin" , "Norton, Scott J" Subject: [PATCH RFC 2/2] qspinlock x86: Enable x86 to use queue spinlock Date: Wed, 31 Jul 2013 22:37:11 -0400 Message-Id: <1375324631-32868-3-git-send-email-Waiman.Long@hp.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1375324631-32868-1-git-send-email-Waiman.Long@hp.com> References: <1375324631-32868-1-git-send-email-Waiman.Long@hp.com> To: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Arnd Bergmann Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch makes the necessary changes at the x86 architecture specific layer to enable the presence of the CONFIG_QUEUE_SPINLOCK kernel option which can be used to replace the ticket spinlock by the queue spinlock. The turning on of ARCH_QUEUE_SPINLOCK config option does not mean that the ticket spinlock will be replaced. It only means that the architecture supports the replacement. Actual replacement will only happen if the QUEUE_SPINLOCK config option is also set. Signed-off-by: Waiman Long --- arch/x86/Kconfig | 3 +++ arch/x86/include/asm/spinlock.h | 2 ++ arch/x86/include/asm/spinlock_types.h | 4 ++++ arch/x86/kernel/paravirt-spinlocks.c | 10 ++++++++++ 4 files changed, 19 insertions(+), 0 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index b32ebf9..8531e47 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2344,6 +2344,9 @@ config X86_DMA_REMAP bool depends on STA2X11 +config ARCH_QUEUE_SPINLOCK + def_bool y + source "net/Kconfig" source "drivers/Kconfig" diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h index 33692ea..0ea805d 100644 --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h @@ -34,6 +34,7 @@ # define UNLOCK_LOCK_PREFIX #endif +#ifndef CONFIG_QUEUE_SPINLOCK /* * Ticket locks are conceptually two parts, one indicating the current head of * the queue, and the other indicating the current tail. The lock is acquired @@ -130,6 +131,7 @@ static __always_inline void arch_spin_lock_flags(arch_spinlock_t *lock, } #endif /* CONFIG_PARAVIRT_SPINLOCKS */ +#endif /* !CONFIG_QUEUE_SPINLOCK */ static inline void arch_spin_unlock_wait(arch_spinlock_t *lock) { diff --git a/arch/x86/include/asm/spinlock_types.h b/arch/x86/include/asm/spinlock_types.h index ad0ad07..8a7721e 100644 --- a/arch/x86/include/asm/spinlock_types.h +++ b/arch/x86/include/asm/spinlock_types.h @@ -7,6 +7,9 @@ #include +#ifdef CONFIG_QUEUE_SPINLOCK +# include +#else #if (CONFIG_NR_CPUS < 256) typedef u8 __ticket_t; typedef u16 __ticketpair_t; @@ -27,6 +30,7 @@ typedef struct arch_spinlock { } arch_spinlock_t; #define __ARCH_SPIN_LOCK_UNLOCKED { { 0 } } +#endif #include diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c index 676b8c7..75569cb 100644 --- a/arch/x86/kernel/paravirt-spinlocks.c +++ b/arch/x86/kernel/paravirt-spinlocks.c @@ -15,6 +15,15 @@ default_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags) struct pv_lock_ops pv_lock_ops = { #ifdef CONFIG_SMP +# ifdef CONFIG_QUEUE_SPINLOCK + .spin_is_locked = queue_spin_is_locked, + .spin_is_contended = queue_spin_is_contended, + + .spin_lock = queue_spin_lock, + .spin_lock_flags = default_spin_lock_flags, + .spin_trylock = queue_spin_trylock, + .spin_unlock = queue_spin_unlock, +# else .spin_is_locked = __ticket_spin_is_locked, .spin_is_contended = __ticket_spin_is_contended, @@ -22,6 +31,7 @@ struct pv_lock_ops pv_lock_ops = { .spin_lock_flags = default_spin_lock_flags, .spin_trylock = __ticket_spin_trylock, .spin_unlock = __ticket_spin_unlock, +# endif #endif }; EXPORT_SYMBOL(pv_lock_ops); -- 1.7.1