From: Peter Zijlstra <peterz@infradead.org> To: Waiman.Long@hp.com Cc: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, peterz@infradead.org, paolo.bonzini@gmail.com, konrad.wilk@oracle.com, boris.ostrovsky@oracle.com, paulmck@linux.vnet.ibm.com, riel@redhat.com, torvalds@linux-foundation.org, raghavendra.kt@linux.vnet.ibm.com, david.vrabel@citrix.com, oleg@redhat.com, scott.norton@hp.com, doug.hatch@hp.com, linux-arch@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, xen-devel@lists.xenproject.org, kvm@vger.kernel.org, luto@amacapital.net Subject: [PATCH 2/9] qspinlock, x86: Enable x86-64 to use queue spinlock Date: Mon, 16 Mar 2015 14:16:15 +0100 [thread overview] Message-ID: <20150316133111.891791423@infradead.org> (raw) In-Reply-To: 20150316131613.720617163@infradead.org [-- Attachment #1: waiman_long-qspinlock_x86-enable_x86-64_to_use_queue_spinlock.patch --] [-- Type: text/plain, Size: 3855 bytes --] From: Waiman Long <Waiman.Long@hp.com> This patch makes the necessary changes at the x86 architecture specific layer to enable the use of queue spinlock for x86-64. As x86-32 machines are typically not multi-socket. The benefit of queue spinlock may not be apparent. So queue spinlock is not enabled. Currently, there is some incompatibilities between the para-virtualized spinlock code (which hard-codes the use of ticket spinlock) and the queue spinlock. Therefore, the use of queue spinlock is disabled when the para-virtualized spinlock is enabled. The arch/x86/include/asm/qspinlock.h header file includes some x86 specific optimization which will make the queue spinlock code perform better than the generic implementation. Cc: Ingo Molnar <mingo@redhat.com> Cc: David Vrabel <david.vrabel@citrix.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Scott J Norton <scott.norton@hp.com> Cc: Paolo Bonzini <paolo.bonzini@gmail.com> Cc: Douglas Hatch <doug.hatch@hp.com> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Rik van Riel <riel@redhat.com> Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com> Signed-off-by: Waiman Long <Waiman.Long@hp.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: http://lkml.kernel.org/r/1421784755-21945-3-git-send-email-Waiman.Long@hp.com --- arch/x86/Kconfig | 1 + arch/x86/include/asm/qspinlock.h | 20 ++++++++++++++++++++ arch/x86/include/asm/spinlock.h | 5 +++++ arch/x86/include/asm/spinlock_types.h | 4 ++++ 4 files changed, 30 insertions(+) create mode 100644 arch/x86/include/asm/qspinlock.h --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -125,6 +125,7 @@ config X86 select MODULES_USE_ELF_RELA if X86_64 select CLONE_BACKWARDS if X86_32 select ARCH_USE_BUILTIN_BSWAP + select ARCH_USE_QUEUE_SPINLOCK select ARCH_USE_QUEUE_RWLOCK select OLD_SIGSUSPEND3 if X86_32 || IA32_EMULATION select OLD_SIGACTION if X86_32 --- /dev/null +++ b/arch/x86/include/asm/qspinlock.h @@ -0,0 +1,20 @@ +#ifndef _ASM_X86_QSPINLOCK_H +#define _ASM_X86_QSPINLOCK_H + +#include <asm-generic/qspinlock_types.h> + +#define queue_spin_unlock queue_spin_unlock +/** + * queue_spin_unlock - release a queue spinlock + * @lock : Pointer to queue spinlock structure + * + * An smp_store_release() on the least-significant byte. + */ +static inline void queue_spin_unlock(struct qspinlock *lock) +{ + smp_store_release((u8 *)lock, 0); +} + +#include <asm-generic/qspinlock.h> + +#endif /* _ASM_X86_QSPINLOCK_H */ --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h @@ -42,6 +42,10 @@ extern struct static_key paravirt_ticketlocks_enabled; static __always_inline bool static_key_false(struct static_key *key); +#ifdef CONFIG_QUEUE_SPINLOCK +#include <asm/qspinlock.h> +#else + #ifdef CONFIG_PARAVIRT_SPINLOCKS static inline void __ticket_enter_slowpath(arch_spinlock_t *lock) @@ -196,6 +200,7 @@ static inline void arch_spin_unlock_wait cpu_relax(); } } +#endif /* CONFIG_QUEUE_SPINLOCK */ /* * Read-write spinlocks, allowing multiple readers --- a/arch/x86/include/asm/spinlock_types.h +++ b/arch/x86/include/asm/spinlock_types.h @@ -23,6 +23,9 @@ typedef u32 __ticketpair_t; #define TICKET_SHIFT (sizeof(__ticket_t) * 8) +#ifdef CONFIG_QUEUE_SPINLOCK +#include <asm-generic/qspinlock_types.h> +#else typedef struct arch_spinlock { union { __ticketpair_t head_tail; @@ -33,6 +36,7 @@ typedef struct arch_spinlock { } arch_spinlock_t; #define __ARCH_SPIN_LOCK_UNLOCKED { { 0 } } +#endif /* CONFIG_QUEUE_SPINLOCK */ #include <asm-generic/qrwlock_types.h>
WARNING: multiple messages have this Message-ID (diff)
From: Peter Zijlstra <peterz@infradead.org> To: Waiman.Long@hp.com Cc: raghavendra.kt@linux.vnet.ibm.com, kvm@vger.kernel.org, peterz@infradead.org, linux-kernel@vger.kernel.org, hpa@zytor.com, boris.ostrovsky@oracle.com, linux-arch@vger.kernel.org, x86@kernel.org, mingo@redhat.com, doug.hatch@hp.com, xen-devel@lists.xenproject.org, paulmck@linux.vnet.ibm.com, riel@redhat.com, scott.norton@hp.com, paolo.bonzini@gmail.com, tglx@linutronix.de, virtualization@lists.linux-foundation.org, oleg@redhat.com, luto@amacapital.net, david.vrabel@citrix.com, torvalds@linux-foundation.org Subject: [PATCH 2/9] qspinlock, x86: Enable x86-64 to use queue spinlock Date: Mon, 16 Mar 2015 14:16:15 +0100 [thread overview] Message-ID: <20150316133111.891791423@infradead.org> (raw) In-Reply-To: 20150316131613.720617163@infradead.org [-- Attachment #1: waiman_long-qspinlock_x86-enable_x86-64_to_use_queue_spinlock.patch --] [-- Type: text/plain, Size: 3851 bytes --] From: Waiman Long <Waiman.Long@hp.com> This patch makes the necessary changes at the x86 architecture specific layer to enable the use of queue spinlock for x86-64. As x86-32 machines are typically not multi-socket. The benefit of queue spinlock may not be apparent. So queue spinlock is not enabled. Currently, there is some incompatibilities between the para-virtualized spinlock code (which hard-codes the use of ticket spinlock) and the queue spinlock. Therefore, the use of queue spinlock is disabled when the para-virtualized spinlock is enabled. The arch/x86/include/asm/qspinlock.h header file includes some x86 specific optimization which will make the queue spinlock code perform better than the generic implementation. Cc: Ingo Molnar <mingo@redhat.com> Cc: David Vrabel <david.vrabel@citrix.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Scott J Norton <scott.norton@hp.com> Cc: Paolo Bonzini <paolo.bonzini@gmail.com> Cc: Douglas Hatch <doug.hatch@hp.com> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Rik van Riel <riel@redhat.com> Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com> Signed-off-by: Waiman Long <Waiman.Long@hp.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: http://lkml.kernel.org/r/1421784755-21945-3-git-send-email-Waiman.Long@hp.com --- arch/x86/Kconfig | 1 + arch/x86/include/asm/qspinlock.h | 20 ++++++++++++++++++++ arch/x86/include/asm/spinlock.h | 5 +++++ arch/x86/include/asm/spinlock_types.h | 4 ++++ 4 files changed, 30 insertions(+) create mode 100644 arch/x86/include/asm/qspinlock.h --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -125,6 +125,7 @@ config X86 select MODULES_USE_ELF_RELA if X86_64 select CLONE_BACKWARDS if X86_32 select ARCH_USE_BUILTIN_BSWAP + select ARCH_USE_QUEUE_SPINLOCK select ARCH_USE_QUEUE_RWLOCK select OLD_SIGSUSPEND3 if X86_32 || IA32_EMULATION select OLD_SIGACTION if X86_32 --- /dev/null +++ b/arch/x86/include/asm/qspinlock.h @@ -0,0 +1,20 @@ +#ifndef _ASM_X86_QSPINLOCK_H +#define _ASM_X86_QSPINLOCK_H + +#include <asm-generic/qspinlock_types.h> + +#define queue_spin_unlock queue_spin_unlock +/** + * queue_spin_unlock - release a queue spinlock + * @lock : Pointer to queue spinlock structure + * + * An smp_store_release() on the least-significant byte. + */ +static inline void queue_spin_unlock(struct qspinlock *lock) +{ + smp_store_release((u8 *)lock, 0); +} + +#include <asm-generic/qspinlock.h> + +#endif /* _ASM_X86_QSPINLOCK_H */ --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h @@ -42,6 +42,10 @@ extern struct static_key paravirt_ticketlocks_enabled; static __always_inline bool static_key_false(struct static_key *key); +#ifdef CONFIG_QUEUE_SPINLOCK +#include <asm/qspinlock.h> +#else + #ifdef CONFIG_PARAVIRT_SPINLOCKS static inline void __ticket_enter_slowpath(arch_spinlock_t *lock) @@ -196,6 +200,7 @@ static inline void arch_spin_unlock_wait cpu_relax(); } } +#endif /* CONFIG_QUEUE_SPINLOCK */ /* * Read-write spinlocks, allowing multiple readers --- a/arch/x86/include/asm/spinlock_types.h +++ b/arch/x86/include/asm/spinlock_types.h @@ -23,6 +23,9 @@ typedef u32 __ticketpair_t; #define TICKET_SHIFT (sizeof(__ticket_t) * 8) +#ifdef CONFIG_QUEUE_SPINLOCK +#include <asm-generic/qspinlock_types.h> +#else typedef struct arch_spinlock { union { __ticketpair_t head_tail; @@ -33,6 +36,7 @@ typedef struct arch_spinlock { } arch_spinlock_t; #define __ARCH_SPIN_LOCK_UNLOCKED { { 0 } } +#endif /* CONFIG_QUEUE_SPINLOCK */ #include <asm-generic/qrwlock_types.h>
next prev parent reply other threads:[~2015-03-16 13:36 UTC|newest] Thread overview: 135+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-03-16 13:16 [PATCH 0/9] qspinlock stuff -v15 Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` [PATCH 1/9] qspinlock: A simple generic 4-byte queue spinlock Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra [this message] 2015-03-16 13:16 ` [PATCH 2/9] qspinlock, x86: Enable x86-64 to use " Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` [PATCH 3/9] qspinlock: Add pending bit Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` [PATCH 4/9] qspinlock: Extract out code snippets for the next patch Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` [PATCH 5/9] qspinlock: Optimize for smaller NR_CPUS Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` [PATCH 6/9] qspinlock: Use a simple write to grab the lock Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` [PATCH 7/9] qspinlock: Revert to test-and-set on hypervisors Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` [PATCH 8/9] qspinlock: Generic paravirt support Peter Zijlstra 2015-03-16 13:16 ` Peter Zijlstra 2015-03-18 20:50 ` Waiman Long 2015-03-19 10:12 ` Peter Zijlstra 2015-03-19 10:12 ` Peter Zijlstra 2015-03-19 10:12 ` Peter Zijlstra 2015-03-19 12:25 ` Peter Zijlstra 2015-03-19 12:25 ` Peter Zijlstra 2015-03-19 13:43 ` Peter Zijlstra 2015-03-19 13:43 ` Peter Zijlstra 2015-03-19 13:43 ` Peter Zijlstra 2015-03-19 23:25 ` Waiman Long 2015-03-19 23:25 ` Waiman Long 2015-03-19 23:25 ` Waiman Long 2015-04-01 16:20 ` Waiman Long 2015-04-01 16:20 ` Waiman Long 2015-04-01 16:20 ` Waiman Long 2015-04-01 17:12 ` Peter Zijlstra 2015-04-01 17:12 ` Peter Zijlstra 2015-04-01 17:12 ` Peter Zijlstra 2015-04-01 17:42 ` Peter Zijlstra 2015-04-01 17:42 ` Peter Zijlstra 2015-04-01 18:17 ` Peter Zijlstra 2015-04-01 18:17 ` Peter Zijlstra 2015-04-01 18:54 ` Waiman Long 2015-04-01 18:54 ` Waiman Long 2015-04-01 18:48 ` Peter Zijlstra 2015-04-01 18:48 ` Peter Zijlstra 2015-04-01 19:58 ` Waiman Long 2015-04-01 21:03 ` Peter Zijlstra 2015-04-01 21:03 ` Peter Zijlstra 2015-04-01 21:03 ` Peter Zijlstra 2015-04-02 16:28 ` Waiman Long 2015-04-02 17:20 ` Peter Zijlstra 2015-04-02 17:20 ` Peter Zijlstra 2015-04-02 19:48 ` Peter Zijlstra 2015-04-02 19:48 ` Peter Zijlstra 2015-04-03 3:39 ` Waiman Long 2015-04-03 3:39 ` Waiman Long 2015-04-03 3:39 ` Waiman Long 2015-04-03 13:43 ` Peter Zijlstra 2015-04-03 13:43 ` Peter Zijlstra 2015-04-03 13:43 ` Peter Zijlstra 2015-04-02 19:48 ` Peter Zijlstra 2015-04-02 17:20 ` Peter Zijlstra 2015-04-02 16:28 ` Waiman Long 2015-04-02 16:28 ` Waiman Long 2015-04-01 19:58 ` Waiman Long 2015-04-01 19:58 ` Waiman Long 2015-04-01 18:48 ` Peter Zijlstra 2015-04-01 18:54 ` Waiman Long 2015-04-01 18:17 ` Peter Zijlstra 2015-04-01 17:42 ` Peter Zijlstra 2015-04-01 20:10 ` Waiman Long 2015-04-01 20:10 ` Waiman Long 2015-04-01 20:10 ` Waiman Long 2015-03-19 12:25 ` Peter Zijlstra 2015-03-18 20:50 ` Waiman Long 2015-03-16 13:16 ` Peter Zijlstra 2015-03-16 13:16 ` [PATCH 9/9] qspinlock, x86, kvm: Implement KVM support for paravirt qspinlock Peter Zijlstra 2015-03-16 13:16 ` [PATCH 9/9] qspinlock,x86,kvm: " Peter Zijlstra 2015-03-16 13:16 ` [PATCH 9/9] qspinlock, x86, kvm: " Peter Zijlstra 2015-03-19 2:45 ` Waiman Long 2015-03-19 10:01 ` Peter Zijlstra 2015-03-19 10:01 ` [PATCH 9/9] qspinlock,x86,kvm: " Peter Zijlstra 2015-03-19 10:01 ` Peter Zijlstra 2015-03-19 21:08 ` [PATCH 9/9] qspinlock, x86, kvm: " Waiman Long 2015-03-19 21:08 ` [PATCH 9/9] qspinlock,x86,kvm: " Waiman Long 2015-03-19 21:08 ` [PATCH 9/9] qspinlock, x86, kvm: " Waiman Long 2015-03-20 7:43 ` Raghavendra K T 2015-03-20 7:43 ` [PATCH 9/9] qspinlock,x86,kvm: " Raghavendra K T 2015-03-20 7:43 ` [PATCH 9/9] qspinlock, x86, kvm: " Raghavendra K T 2015-03-19 2:45 ` Waiman Long 2015-03-16 14:08 ` [PATCH 0/9] qspinlock stuff -v15 David Vrabel 2015-03-16 14:08 ` [Xen-devel] " David Vrabel 2015-03-16 14:08 ` David Vrabel 2015-03-16 14:08 ` David Vrabel 2015-03-16 14:08 ` David Vrabel 2015-03-18 20:36 ` Waiman Long 2015-03-18 20:36 ` Waiman Long 2015-03-18 20:36 ` Waiman Long 2015-03-19 18:01 ` [Xen-devel] " David Vrabel 2015-03-19 18:01 ` David Vrabel 2015-03-19 18:01 ` David Vrabel 2015-03-19 18:32 ` Peter Zijlstra 2015-03-19 18:32 ` Peter Zijlstra 2015-03-19 18:32 ` Peter Zijlstra 2015-03-19 18:01 ` David Vrabel 2015-03-25 19:47 ` Konrad Rzeszutek Wilk 2015-03-26 20:21 ` Peter Zijlstra 2015-03-26 20:21 ` Peter Zijlstra 2015-03-26 20:21 ` Peter Zijlstra 2015-03-27 14:07 ` Konrad Rzeszutek Wilk 2015-03-27 14:07 ` Konrad Rzeszutek Wilk 2015-03-27 14:07 ` Konrad Rzeszutek Wilk 2015-03-30 16:41 ` Waiman Long 2015-03-30 16:41 ` Waiman Long 2015-03-30 16:41 ` Waiman Long 2015-03-30 16:25 ` Waiman Long 2015-03-30 16:25 ` Waiman Long 2015-03-30 16:29 ` Peter Zijlstra 2015-03-30 16:29 ` Peter Zijlstra 2015-03-30 16:43 ` Waiman Long 2015-03-30 16:43 ` Waiman Long 2015-03-30 16:43 ` Waiman Long 2015-03-30 16:29 ` Peter Zijlstra 2015-03-30 16:25 ` Waiman Long 2015-03-25 19:47 ` Konrad Rzeszutek Wilk 2015-03-25 19:47 ` Konrad Rzeszutek Wilk 2015-03-27 6:40 ` Raghavendra K T 2015-03-27 6:40 ` Raghavendra K T 2015-03-27 6:40 ` Raghavendra K T
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20150316133111.891791423@infradead.org \ --to=peterz@infradead.org \ --cc=Waiman.Long@hp.com \ --cc=boris.ostrovsky@oracle.com \ --cc=david.vrabel@citrix.com \ --cc=doug.hatch@hp.com \ --cc=hpa@zytor.com \ --cc=konrad.wilk@oracle.com \ --cc=kvm@vger.kernel.org \ --cc=linux-arch@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=luto@amacapital.net \ --cc=mingo@redhat.com \ --cc=oleg@redhat.com \ --cc=paolo.bonzini@gmail.com \ --cc=paulmck@linux.vnet.ibm.com \ --cc=raghavendra.kt@linux.vnet.ibm.com \ --cc=riel@redhat.com \ --cc=scott.norton@hp.com \ --cc=tglx@linutronix.de \ --cc=torvalds@linux-foundation.org \ --cc=virtualization@lists.linux-foundation.org \ --cc=x86@kernel.org \ --cc=xen-devel@lists.xenproject.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.