From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Waiman Long <Waiman.Long@hp.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
kvm@vger.kernel.org, Peter Zijlstra <peterz@infradead.org>,
virtualization@lists.linux-foundation.org,
Andi Kleen <andi@firstfloor.org>,
"H. Peter Anvin" <hpa@zytor.com>,
Michel Lespinasse <walken@google.com>,
Thomas Gleixner <tglx@linutronix.de>,
linux-arch@vger.kernel.org, Gleb Natapov <gleb@redhat.com>,
x86@kernel.org, Ingo Molnar <mingo@redhat.com>,
xen-devel@lists.xenproject.org,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Rik van Riel <riel@redhat.com>, Arnd Bergmann <arnd@arndb.de>,
Scott J Norton <scott.norton@hp.com>,
Steven Rostedt <rostedt@goodmis.org>,
Chris Wright <chrisw@sous-sol.org>,
Oleg Nesterov <oleg@redhat.com>,
Alok Kataria <akataria@vmware.com>,
Aswin Chandramouleeswaran <aswin@hp.com>,
Chegu Vinod <chegu_vinod@hp.com>,
Boris Ostrovsky <boris.ostrovsky>
Subject: Re: [PATCH v7 02/11] qspinlock, x86: Enable x86-64 to use queue spinlock
Date: Wed, 19 Mar 2014 16:24:05 -0400 [thread overview]
Message-ID: <20140319202405.GA11210@phenom.dumpdata.com> (raw)
In-Reply-To: <1395260049-30839-3-git-send-email-Waiman.Long@hp.com>
On Wed, Mar 19, 2014 at 04:14:00PM -0400, Waiman Long wrote:
> 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.
And how does this patch do that? I think that comment is obsolete?
>
> 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.
>
> Signed-off-by: Waiman Long <Waiman.Long@hp.com>
> Acked-by: Rik van Riel <riel@redhat.com>
> ---
> arch/x86/Kconfig | 1 +
> arch/x86/include/asm/qspinlock.h | 41 +++++++++++++++++++++++++++++++++
> arch/x86/include/asm/spinlock.h | 5 ++++
> arch/x86/include/asm/spinlock_types.h | 4 +++
> 4 files changed, 51 insertions(+), 0 deletions(-)
> create mode 100644 arch/x86/include/asm/qspinlock.h
>
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 0af5250..de573f9 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -17,6 +17,7 @@ config X86_64
> depends on 64BIT
> select X86_DEV_DMA_OPS
> select ARCH_USE_CMPXCHG_LOCKREF
> + select ARCH_USE_QUEUE_SPINLOCK
>
> ### Arch settings
> config X86
> diff --git a/arch/x86/include/asm/qspinlock.h b/arch/x86/include/asm/qspinlock.h
> new file mode 100644
> index 0000000..44cefee
> --- /dev/null
> +++ b/arch/x86/include/asm/qspinlock.h
> @@ -0,0 +1,41 @@
> +#ifndef _ASM_X86_QSPINLOCK_H
> +#define _ASM_X86_QSPINLOCK_H
> +
> +#include <asm-generic/qspinlock_types.h>
> +
> +#if !defined(CONFIG_X86_OOSTORE) && !defined(CONFIG_X86_PPRO_FENCE)
> +
> +#define _ARCH_SUPPORTS_ATOMIC_8_16_BITS_OPS
> +
> +/*
> + * x86-64 specific queue spinlock union structure
> + */
> +union arch_qspinlock {
> + struct qspinlock slock;
> + u8 lock; /* Lock bit */
> +};
> +
> +#define queue_spin_unlock queue_spin_unlock
> +/**
> + * queue_spin_unlock - release a queue spinlock
> + * @lock : Pointer to queue spinlock structure
> + *
> + * No special memory barrier other than a compiler one is needed for the
> + * x86 architecture. A compiler barrier is added at the end to make sure
> + * that the clearing the lock bit is done ASAP without artificial delay
> + * due to compiler optimization.
> + */
> +static inline void queue_spin_unlock(struct qspinlock *lock)
> +{
> + union arch_qspinlock *qlock = (union arch_qspinlock *)lock;
> +
> + barrier();
> + ACCESS_ONCE(qlock->lock) = 0;
> + barrier();
> +}
> +
> +#endif /* !CONFIG_X86_OOSTORE && !CONFIG_X86_PPRO_FENCE */
> +
> +#include <asm-generic/qspinlock.h>
> +
> +#endif /* _ASM_X86_QSPINLOCK_H */
> diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
> index 0f62f54..958d20f 100644
> --- 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)
> @@ -180,6 +184,7 @@ static __always_inline void arch_spin_lock_flags(arch_spinlock_t *lock,
> {
> arch_spin_lock(lock);
> }
> +#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 4f1bea1..7960268 100644
> --- 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/rwlock.h>
>
> --
> 1.7.1
>
WARNING: multiple messages have this Message-ID (diff)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Waiman Long <Waiman.Long@hp.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
kvm@vger.kernel.org, Peter Zijlstra <peterz@infradead.org>,
virtualization@lists.linux-foundation.org,
Andi Kleen <andi@firstfloor.org>,
"H. Peter Anvin" <hpa@zytor.com>,
Michel Lespinasse <walken@google.com>,
Thomas Gleixner <tglx@linutronix.de>,
linux-arch@vger.kernel.org, Gleb Natapov <gleb@redhat.com>,
x86@kernel.org, Ingo Molnar <mingo@redhat.com>,
xen-devel@lists.xenproject.org,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Rik van Riel <riel@redhat.com>, Arnd Bergmann <arnd@arndb.de>,
Scott J Norton <scott.norton@hp.com>,
Steven Rostedt <rostedt@goodmis.org>,
Chris Wright <chrisw@sous-sol.org>,
Oleg Nesterov <oleg@redhat.com>,
Alok Kataria <akataria@vmware.com>,
Aswin Chandramouleeswaran <aswin@hp.com>,
Chegu Vinod <chegu_vinod@hp.com>,
Boris Ostrovsky <boris.ostrovsky
Subject: Re: [PATCH v7 02/11] qspinlock, x86: Enable x86-64 to use queue spinlock
Date: Wed, 19 Mar 2014 16:24:05 -0400 [thread overview]
Message-ID: <20140319202405.GA11210@phenom.dumpdata.com> (raw)
In-Reply-To: <1395260049-30839-3-git-send-email-Waiman.Long@hp.com>
On Wed, Mar 19, 2014 at 04:14:00PM -0400, Waiman Long wrote:
> 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.
And how does this patch do that? I think that comment is obsolete?
>
> 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.
>
> Signed-off-by: Waiman Long <Waiman.Long@hp.com>
> Acked-by: Rik van Riel <riel@redhat.com>
> ---
> arch/x86/Kconfig | 1 +
> arch/x86/include/asm/qspinlock.h | 41 +++++++++++++++++++++++++++++++++
> arch/x86/include/asm/spinlock.h | 5 ++++
> arch/x86/include/asm/spinlock_types.h | 4 +++
> 4 files changed, 51 insertions(+), 0 deletions(-)
> create mode 100644 arch/x86/include/asm/qspinlock.h
>
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 0af5250..de573f9 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -17,6 +17,7 @@ config X86_64
> depends on 64BIT
> select X86_DEV_DMA_OPS
> select ARCH_USE_CMPXCHG_LOCKREF
> + select ARCH_USE_QUEUE_SPINLOCK
>
> ### Arch settings
> config X86
> diff --git a/arch/x86/include/asm/qspinlock.h b/arch/x86/include/asm/qspinlock.h
> new file mode 100644
> index 0000000..44cefee
> --- /dev/null
> +++ b/arch/x86/include/asm/qspinlock.h
> @@ -0,0 +1,41 @@
> +#ifndef _ASM_X86_QSPINLOCK_H
> +#define _ASM_X86_QSPINLOCK_H
> +
> +#include <asm-generic/qspinlock_types.h>
> +
> +#if !defined(CONFIG_X86_OOSTORE) && !defined(CONFIG_X86_PPRO_FENCE)
> +
> +#define _ARCH_SUPPORTS_ATOMIC_8_16_BITS_OPS
> +
> +/*
> + * x86-64 specific queue spinlock union structure
> + */
> +union arch_qspinlock {
> + struct qspinlock slock;
> + u8 lock; /* Lock bit */
> +};
> +
> +#define queue_spin_unlock queue_spin_unlock
> +/**
> + * queue_spin_unlock - release a queue spinlock
> + * @lock : Pointer to queue spinlock structure
> + *
> + * No special memory barrier other than a compiler one is needed for the
> + * x86 architecture. A compiler barrier is added at the end to make sure
> + * that the clearing the lock bit is done ASAP without artificial delay
> + * due to compiler optimization.
> + */
> +static inline void queue_spin_unlock(struct qspinlock *lock)
> +{
> + union arch_qspinlock *qlock = (union arch_qspinlock *)lock;
> +
> + barrier();
> + ACCESS_ONCE(qlock->lock) = 0;
> + barrier();
> +}
> +
> +#endif /* !CONFIG_X86_OOSTORE && !CONFIG_X86_PPRO_FENCE */
> +
> +#include <asm-generic/qspinlock.h>
> +
> +#endif /* _ASM_X86_QSPINLOCK_H */
> diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
> index 0f62f54..958d20f 100644
> --- 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)
> @@ -180,6 +184,7 @@ static __always_inline void arch_spin_lock_flags(arch_spinlock_t *lock,
> {
> arch_spin_lock(lock);
> }
> +#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 4f1bea1..7960268 100644
> --- 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/rwlock.h>
>
> --
> 1.7.1
>
next prev parent reply other threads:[~2014-03-19 20:24 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-19 20:13 [PATCH v7 00/11] qspinlock: a 4-byte queue spinlock with PV support Waiman Long
2014-03-19 20:13 ` [PATCH v7 01/11] qspinlock: A generic 4-byte queue spinlock implementation Waiman Long
2014-03-19 20:13 ` Waiman Long
2014-03-19 20:14 ` [PATCH v7 02/11] qspinlock, x86: Enable x86-64 to use queue spinlock Waiman Long
2014-03-19 20:14 ` Waiman Long
2014-03-19 20:24 ` Konrad Rzeszutek Wilk [this message]
2014-03-19 20:24 ` Konrad Rzeszutek Wilk
2014-03-21 3:36 ` Waiman Long
2014-03-21 3:36 ` Waiman Long
2014-03-21 3:36 ` Waiman Long
2014-03-19 20:24 ` Konrad Rzeszutek Wilk
2014-03-19 20:14 ` [PATCH v7 03/11] qspinlock: More optimized code for smaller NR_CPUS Waiman Long
2014-03-19 20:14 ` Waiman Long
2014-03-19 20:14 ` [PATCH v7 04/11] qspinlock: Optimized code path for 2 contending tasks Waiman Long
2014-03-19 20:14 ` Waiman Long
2014-03-19 20:14 ` [PATCH v7 05/11] pvqspinlock, x86: Allow unfair spinlock in a PV guest Waiman Long
2014-03-19 20:14 ` Waiman Long
2014-03-19 20:14 ` [PATCH v7 06/11] pvqspinlock, x86: Allow unfair queue spinlock in a KVM guest Waiman Long
2014-03-19 20:14 ` Waiman Long
2014-03-20 22:01 ` Paolo Bonzini
2014-03-20 22:01 ` Paolo Bonzini
2014-03-20 22:29 ` H. Peter Anvin
2014-03-20 22:29 ` H. Peter Anvin
2014-03-20 22:40 ` Paolo Bonzini
2014-03-20 22:40 ` Paolo Bonzini
2014-03-20 22:40 ` Paolo Bonzini
2014-03-20 22:29 ` H. Peter Anvin
2014-03-21 21:27 ` Waiman Long
2014-03-21 21:27 ` Waiman Long
2014-03-20 22:01 ` Paolo Bonzini
2014-03-19 20:14 ` [PATCH v7 07/11] pvqspinlock, x86: Allow unfair queue spinlock in a XEN guest Waiman Long
2014-03-19 20:14 ` Waiman Long
2014-03-19 20:28 ` Konrad Rzeszutek Wilk
2014-03-19 20:28 ` Konrad Rzeszutek Wilk
2014-03-19 20:28 ` Konrad Rzeszutek Wilk
2014-03-21 3:40 ` Waiman Long
2014-03-21 3:40 ` Waiman Long
2014-03-21 3:40 ` Waiman Long
2014-03-19 20:14 ` [PATCH v7 08/11] pvqspinlock, x86: Rename paravirt_ticketlocks_enabled Waiman Long
2014-03-19 20:14 ` Waiman Long
2014-03-19 20:14 ` [PATCH v7 09/11] pvqspinlock, x86: Add qspinlock para-virtualization support Waiman Long
2014-03-19 20:14 ` Waiman Long
2014-03-19 20:14 ` [PATCH v7 10/11] pvqspinlock, x86: Enable qspinlock PV support for KVM Waiman Long
2014-03-20 22:07 ` Paolo Bonzini
2014-03-20 22:07 ` Paolo Bonzini
2014-03-20 22:07 ` Paolo Bonzini
2014-03-21 21:41 ` Waiman Long
2014-03-21 21:41 ` Waiman Long
2014-03-19 20:14 ` Waiman Long
2014-03-19 20:14 ` [PATCH RFC v7 11/11] pvqspinlock, x86: Enable qspinlock PV support for XEN Waiman Long
2014-03-19 20:14 ` Waiman Long
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=20140319202405.GA11210@phenom.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=Waiman.Long@hp.com \
--cc=akataria@vmware.com \
--cc=andi@firstfloor.org \
--cc=arnd@arndb.de \
--cc=aswin@hp.com \
--cc=chegu_vinod@hp.com \
--cc=chrisw@sous-sol.org \
--cc=gleb@redhat.com \
--cc=hpa@zytor.com \
--cc=jeremy@goop.org \
--cc=kvm@vger.kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=oleg@redhat.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=raghavendra.kt@linux.vnet.ibm.com \
--cc=riel@redhat.com \
--cc=rostedt@goodmis.org \
--cc=scott.norton@hp.com \
--cc=tglx@linutronix.de \
--cc=virtualization@lists.linux-foundation.org \
--cc=walken@google.com \
--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: link
Be 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.