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>,
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>,
Alok Kataria <akataria@vmware.com>,
linux-arch@vger.kernel.org, x86@kernel.org,
Ingo Molnar <mingo@redhat.com>,
Scott J Norton <scott.norton@hp.com>,
xen-devel@lists.xenproject.org,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Alexander Fyodorov <halcy@yandex.ru>,
Rik van Riel <riel@redhat.com>, Arnd Bergmann <arnd@arndb.de>,
Daniel J Blueman <daniel@numascale.com>,
Oleg Nesterov <oleg@redhat.com>,
Steven Rostedt <rostedt@goodmis.org>,
Chris Wright <chrisw@sous-sol.org>,
George Spelvin <linux@horizon.com>,
Thomas Gleixner <tglx@linutronix.de>,
Aswin Chandramouleeswaran <aswin@hp.com>,
Cheg
Subject: Re: [PATCH RFC v5 4/8] pvqspinlock, x86: Allow unfair spinlock in a real PV environment
Date: Wed, 26 Feb 2014 12:07:34 -0500 [thread overview]
Message-ID: <20140226170734.GB20775@phenom.dumpdata.com> (raw)
In-Reply-To: <1393427668-60228-5-git-send-email-Waiman.Long@hp.com>
On Wed, Feb 26, 2014 at 10:14:24AM -0500, Waiman Long wrote:
> Locking is always an issue in a virtualized environment as the virtual
> CPU that is waiting on a lock may get scheduled out and hence block
> any progress in lock acquisition even when the lock has been freed.
>
> One solution to this problem is to allow unfair lock in a
> para-virtualized environment. In this case, a new lock acquirer can
> come and steal the lock if the next-in-line CPU to get the lock is
> scheduled out. Unfair lock in a native environment is generally not a
Hmm, how do you know if the 'next-in-line CPU' is scheduled out? As
in the hypervisor knows - but you as a guest might have no idea
of it.
> good idea as there is a possibility of lock starvation for a heavily
> contended lock.
Should this then detect whether it is running under a virtualization
and only then activate itself? And when run under baremetal don't enable?
>
> This patch add a new configuration option for the x86
> architecture to enable the use of unfair queue spinlock
> (PARAVIRT_UNFAIR_LOCKS) in a real para-virtualized guest. A jump label
> (paravirt_unfairlocks_enabled) is used to switch between a fair and
> an unfair version of the spinlock code. This jump label will only be
> enabled in a real PV guest.
As opposed to fake PV guest :-) I think you can remove the 'real'.
>
> Enabling this configuration feature decreases the performance of an
> uncontended lock-unlock operation by about 1-2%.
Presumarily on baremetal right?
>
> Signed-off-by: Waiman Long <Waiman.Long@hp.com>
> ---
> arch/x86/Kconfig | 11 +++++
> arch/x86/include/asm/qspinlock.h | 74 ++++++++++++++++++++++++++++++++++
> arch/x86/kernel/Makefile | 1 +
> arch/x86/kernel/paravirt-spinlocks.c | 7 +++
> 4 files changed, 93 insertions(+), 0 deletions(-)
>
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 5bf70ab..8d7c941 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -645,6 +645,17 @@ config PARAVIRT_SPINLOCKS
>
> If you are unsure how to answer this question, answer Y.
>
> +config PARAVIRT_UNFAIR_LOCKS
> + bool "Enable unfair locks in a para-virtualized guest"
> + depends on PARAVIRT && SMP && QUEUE_SPINLOCK
> + depends on !CONFIG_X86_OOSTORE && !CONFIG_X86_PPRO_FENCE
> + ---help---
> + This changes the kernel to use unfair locks in a real
> + para-virtualized guest system. This will help performance
> + in most cases. However, there is a possibility of lock
> + starvation on a heavily contended lock especially in a
> + large guest with many virtual CPUs.
> +
> source "arch/x86/xen/Kconfig"
>
> config KVM_GUEST
> diff --git a/arch/x86/include/asm/qspinlock.h b/arch/x86/include/asm/qspinlock.h
> index 98db42e..c278aed 100644
> --- a/arch/x86/include/asm/qspinlock.h
> +++ b/arch/x86/include/asm/qspinlock.h
> @@ -56,4 +56,78 @@ static inline void queue_spin_unlock(struct qspinlock *lock)
>
> #include <asm-generic/qspinlock.h>
>
> +#ifdef CONFIG_PARAVIRT_UNFAIR_LOCKS
> +/**
> + * queue_spin_lock_unfair - acquire a queue spinlock unfairly
> + * @lock: Pointer to queue spinlock structure
> + */
> +static __always_inline void queue_spin_lock_unfair(struct qspinlock *lock)
> +{
> + union arch_qspinlock *qlock = (union arch_qspinlock *)lock;
> +
> + if (likely(cmpxchg(&qlock->lock, 0, _QSPINLOCK_LOCKED) == 0))
> + return;
> + /*
> + * Since the lock is now unfair, there is no need to activate
> + * the 2-task quick spinning code path.
> + */
> + queue_spin_lock_slowpath(lock, -1);
> +}
> +
> +/**
> + * queue_spin_trylock_unfair - try to acquire the queue spinlock unfairly
> + * @lock : Pointer to queue spinlock structure
> + * Return: 1 if lock acquired, 0 if failed
> + */
> +static __always_inline int queue_spin_trylock_unfair(struct qspinlock *lock)
> +{
> + union arch_qspinlock *qlock = (union arch_qspinlock *)lock;
> +
> + if (!qlock->lock &&
> + (cmpxchg(&qlock->lock, 0, _QSPINLOCK_LOCKED) == 0))
> + return 1;
> + return 0;
> +}
> +
> +/*
> + * Redefine arch_spin_lock and arch_spin_trylock as inline functions that will
> + * jump to the unfair versions if the static key paravirt_unfairlocks_enabled
> + * is true.
> + */
> +#undef arch_spin_lock
> +#undef arch_spin_trylock
> +#undef arch_spin_lock_flags
> +
> +extern struct static_key paravirt_unfairlocks_enabled;
> +
> +/**
> + * arch_spin_lock - acquire a queue spinlock
> + * @lock: Pointer to queue spinlock structure
> + */
> +static inline void arch_spin_lock(struct qspinlock *lock)
> +{
> + if (static_key_false(¶virt_unfairlocks_enabled)) {
> + queue_spin_lock_unfair(lock);
> + return;
> + }
> + queue_spin_lock(lock);
What happens when you are booting and you are in the middle of using a
ticketlock (say you are waiting for it and your are in the slow-path)
and suddenly the unfairlocks_enabled is turned on.
All the other CPUs start using the unfair version and are you still
in the ticketlock unlocker (or worst, locker and going to sleep).
> +}
> +
> +/**
> + * arch_spin_trylock - try to acquire the queue spinlock
> + * @lock : Pointer to queue spinlock structure
> + * Return: 1 if lock acquired, 0 if failed
> + */
> +static inline int arch_spin_trylock(struct qspinlock *lock)
> +{
> + if (static_key_false(¶virt_unfairlocks_enabled)) {
> + return queue_spin_trylock_unfair(lock);
> + }
> + return queue_spin_trylock(lock);
> +}
> +
> +#define arch_spin_lock_flags(l, f) arch_spin_lock(l)
> +
> +#endif /* CONFIG_PARAVIRT_UNFAIR_LOCKS */
> +
> #endif /* _ASM_X86_QSPINLOCK_H */
> diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
> index cb648c8..1107a20 100644
> --- a/arch/x86/kernel/Makefile
> +++ b/arch/x86/kernel/Makefile
> @@ -88,6 +88,7 @@ obj-$(CONFIG_DEBUG_NMI_SELFTEST) += nmi_selftest.o
> obj-$(CONFIG_KVM_GUEST) += kvm.o kvmclock.o
> obj-$(CONFIG_PARAVIRT) += paravirt.o paravirt_patch_$(BITS).o
> obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= paravirt-spinlocks.o
> +obj-$(CONFIG_PARAVIRT_UNFAIR_LOCKS)+= paravirt-spinlocks.o
> obj-$(CONFIG_PARAVIRT_CLOCK) += pvclock.o
>
> obj-$(CONFIG_PCSPKR_PLATFORM) += pcspeaker.o
> diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c
> index bbb6c73..a50032a 100644
> --- a/arch/x86/kernel/paravirt-spinlocks.c
> +++ b/arch/x86/kernel/paravirt-spinlocks.c
> @@ -8,6 +8,7 @@
>
> #include <asm/paravirt.h>
>
> +#ifdef CONFIG_PARAVIRT_SPINLOCKS
> struct pv_lock_ops pv_lock_ops = {
> #ifdef CONFIG_SMP
> .lock_spinning = __PV_IS_CALLEE_SAVE(paravirt_nop),
> @@ -18,3 +19,9 @@ EXPORT_SYMBOL(pv_lock_ops);
>
> struct static_key paravirt_ticketlocks_enabled = STATIC_KEY_INIT_FALSE;
> EXPORT_SYMBOL(paravirt_ticketlocks_enabled);
> +#endif
> +
> +#ifdef CONFIG_PARAVIRT_UNFAIR_LOCKS
> +struct static_key paravirt_unfairlocks_enabled = STATIC_KEY_INIT_FALSE;
> +EXPORT_SYMBOL(paravirt_unfairlocks_enabled);
> +#endif
> --
> 1.7.1
>
next prev parent reply other threads:[~2014-02-26 17:07 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-26 15:14 [PATCH v5 0/8] qspinlock: a 4-byte queue spinlock with PV support Waiman Long
2014-02-26 15:14 ` [PATCH v5 1/8] qspinlock: Introducing a 4-byte queue spinlock implementation Waiman Long
2014-02-26 16:22 ` Peter Zijlstra
2014-02-27 20:25 ` Waiman Long
2014-02-26 16:24 ` Peter Zijlstra
2014-02-27 20:25 ` Waiman Long
2014-02-26 15:14 ` [PATCH v5 2/8] qspinlock, x86: Enable x86-64 to use queue spinlock Waiman Long
2014-02-26 15:14 ` [PATCH v5 3/8] qspinlock, x86: Add x86 specific optimization for 2 contending tasks Waiman Long
2014-02-26 16:20 ` Peter Zijlstra
2014-02-27 20:42 ` Waiman Long
2014-02-28 9:29 ` Peter Zijlstra
2014-02-28 16:25 ` Linus Torvalds
2014-02-28 17:37 ` Peter Zijlstra
2014-02-28 16:38 ` Waiman Long
2014-02-28 17:56 ` Peter Zijlstra
2014-03-03 17:43 ` Peter Zijlstra
2014-03-04 15:27 ` Waiman Long
2014-03-04 16:58 ` Peter Zijlstra
2014-03-04 18:09 ` Peter Zijlstra
2014-03-04 17:48 ` Waiman Long
2014-03-04 22:40 ` Peter Zijlstra
2014-03-05 20:59 ` Peter Zijlstra
2014-02-26 15:14 ` [PATCH RFC v5 4/8] pvqspinlock, x86: Allow unfair spinlock in a real PV environment Waiman Long
2014-02-26 17:07 ` Konrad Rzeszutek Wilk [this message]
2014-02-28 17:06 ` Waiman Long
2014-03-03 10:55 ` Paolo Bonzini
2014-03-04 15:15 ` Waiman Long
2014-03-04 15:23 ` Paolo Bonzini
2014-03-04 15:39 ` David Vrabel
2014-03-04 17:50 ` Raghavendra K T
2014-02-27 12:28 ` David Vrabel
2014-02-27 19:40 ` Waiman Long
2014-02-26 15:14 ` [PATCH RFC v5 5/8] pvqspinlock, x86: Enable unfair queue spinlock in a KVM guest Waiman Long
2014-02-26 17:08 ` Konrad Rzeszutek Wilk
2014-02-28 17:08 ` Waiman Long
2014-02-27 9:41 ` Paolo Bonzini
2014-02-27 19:05 ` Waiman Long
2014-02-27 10:40 ` Raghavendra K T
2014-02-27 19:12 ` Waiman Long
2014-02-26 15:14 ` [PATCH RFC v5 6/8] pvqspinlock, x86: Rename paravirt_ticketlocks_enabled Waiman Long
2014-02-26 15:14 ` [PATCH RFC v5 7/8] pvqspinlock, x86: Add qspinlock para-virtualization support Waiman Long
2014-02-26 17:54 ` Konrad Rzeszutek Wilk
2014-02-27 12:11 ` David Vrabel
2014-02-27 13:11 ` Paolo Bonzini
2014-02-27 14:18 ` David Vrabel
2014-02-27 14:45 ` Paolo Bonzini
2014-02-27 15:22 ` Raghavendra K T
2014-02-27 15:50 ` Paolo Bonzini
2014-03-03 11:06 ` [Xen-devel] " David Vrabel
2014-02-27 20:50 ` Waiman Long
2014-02-27 19:42 ` Waiman Long
2014-02-26 15:14 ` [PATCH RFC v5 8/8] pvqspinlock, x86: Enable KVM to use qspinlock's PV support Waiman Long
2014-02-27 9:31 ` Paolo Bonzini
2014-02-27 18:36 ` Waiman Long
2014-02-26 17:00 ` [PATCH v5 0/8] qspinlock: a 4-byte queue spinlock with " Konrad Rzeszutek Wilk
2014-02-28 16:56 ` Waiman Long
2014-02-26 22:26 ` Paul E. McKenney
-- strict thread matches above, loose matches on Subject: below --
2014-02-27 4:32 Waiman Long
2014-02-27 4:32 ` [PATCH RFC v5 4/8] pvqspinlock, x86: Allow unfair spinlock in a real PV environment 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=20140226170734.GB20775@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=chrisw@sous-sol.org \
--cc=daniel@numascale.com \
--cc=halcy@yandex.ru \
--cc=hpa@zytor.com \
--cc=jeremy@goop.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux@horizon.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).