public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: vatsa@linux.vnet.ibm.com
Cc: Marcelo Tosatti <mtosatti@redhat.com>,
	Gleb Natapov <gleb@redhat.com>,
	linux-kernel@vger.kernel.org, npiggin@suse.de,
	Jeremy Fitzhardinge <jeremy@goop.org>,
	kvm@vger.kernel.org, bharata@in.ibm.com,
	Balbir Singh <balbir@in.ibm.com>,
	Jan Beulich <JBeulich@novell.com>
Subject: Re: [PATCH RFC 3/4] Paravirtualized spinlock implementation for KVM guests
Date: Mon, 02 Aug 2010 11:48:41 +0300	[thread overview]
Message-ID: <4C568669.40001@redhat.com> (raw)
In-Reply-To: <20100726061537.GC8402@linux.vnet.ibm.com>

  On 07/26/2010 09:15 AM, Srivatsa Vaddagiri wrote:
> Paravirtual spinlock implementation for KVM guests, based heavily on Xen guest's
> spinlock implementation.
>
>
> +
> +static struct spinlock_stats
> +{
> +	u64 taken;
> +	u32 taken_slow;
> +
> +	u64 released;
> +
> +#define HISTO_BUCKETS	30
> +	u32 histo_spin_total[HISTO_BUCKETS+1];
> +	u32 histo_spin_spinning[HISTO_BUCKETS+1];
> +	u32 histo_spin_blocked[HISTO_BUCKETS+1];
> +
> +	u64 time_total;
> +	u64 time_spinning;
> +	u64 time_blocked;
> +} spinlock_stats;

Could these be replaced by tracepoints when starting to spin/stopping 
spinning etc?  Then userspace can reconstruct the histogram as well as 
see which locks are involved and what call paths.

> +struct kvm_spinlock {
> +	unsigned char lock;		/* 0 ->  free; 1 ->  locked */
> +	unsigned short spinners;	/* count of waiting cpus */
> +};
> +
> +/*
> + * Mark a cpu as interested in a lock.  Returns the CPU's previous
> + * lock of interest, in case we got preempted by an interrupt.
> + */
> +static inline void spinning_lock(struct kvm_spinlock *pl)
> +{
> +	asm(LOCK_PREFIX " incw %0"
> +	    : "+m" (pl->spinners) : : "memory");
> +}
> +
> +/*
> + * Mark a cpu as no longer interested in a lock.  Restores previous
> + * lock of interest (NULL for none).
> + */
> +static inline void unspinning_lock(struct kvm_spinlock *pl)
> +{
> +	asm(LOCK_PREFIX " decw %0"
> +	    : "+m" (pl->spinners) : : "memory");
> +}
> +
> +static int kvm_spin_is_locked(struct arch_spinlock *lock)
> +{
> +	struct kvm_spinlock *sl = (struct kvm_spinlock *)lock;
> +
> +	return sl->lock != 0;
> +}
> +
> +static int kvm_spin_is_contended(struct arch_spinlock *lock)
> +{
> +	struct kvm_spinlock *sl = (struct kvm_spinlock *)lock;
> +
> +	/* Not strictly true; this is only the count of contended
> +	   lock-takers entering the slow path. */
> +	return sl->spinners != 0;
> +}
> +
> +static int kvm_spin_trylock(struct arch_spinlock *lock)
> +{
> +	struct kvm_spinlock *sl = (struct kvm_spinlock *)lock;
> +	u8 old = 1;
> +
> +	asm("xchgb %b0,%1"
> +	    : "+q" (old), "+m" (sl->lock) : : "memory");
> +
> +	return old == 0;
> +}
> +
> +static noinline int kvm_spin_lock_slow(struct arch_spinlock *lock)
> +{
> +	struct kvm_spinlock *sl = (struct kvm_spinlock *)lock;
> +	u64 start;
> +
> +	ADD_STATS(taken_slow, 1);
> +
> +	/* announce we're spinning */
> +	spinning_lock(sl);
> +
> +	start = spin_time_start();
> +	kvm_hypercall0(KVM_HC_YIELD);

Oh.  This isn't really a yield since we expect to be woken up?  It's 
more of a sleep.

We already have a sleep hypercall, it's called HLT.  If we can use it, 
the thing can work on older hosts.  It's tricky though:

- if interrupts were enabled before we started spinning, sleep with 
interrupts enabled.  This also allows the spinner to switch to another 
process if some completion comes along so it's a good idea anyway.  Wake 
up sends an IPI.
- if not, we need to use NMI to wake up.  This is somewhat icky since 
there's no atomic "enable NMI and sleep" instruction, so we have to 
handle the case of the wake up arriving before HLT (can be done by 
examining RIP and seeing if it's in the critical section).

-- 
error compiling committee.c: too many arguments to function


  reply	other threads:[~2010-08-02  8:48 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-26  6:11 [PATCH RFC 0/4] Paravirt-spinlock implementation for KVM guests (Version 0) Srivatsa Vaddagiri
2010-07-26  6:13 ` [PATCH RFC 1/4] Debugfs support for reading an array of u32-type integers Srivatsa Vaddagiri
2010-07-26  6:14 ` [PATCH RFC 2/4] Add yield hypercall for KVM guests Srivatsa Vaddagiri
2010-07-26 17:19   ` Jeremy Fitzhardinge
2010-07-28 14:55     ` Srivatsa Vaddagiri
2010-08-02  8:40       ` Avi Kivity
2010-08-03  5:16         ` Srivatsa Vaddagiri
2010-08-03  5:33           ` Srivatsa Vaddagiri
2010-08-02  8:32     ` Avi Kivity
2010-08-02 14:42       ` Ryan Harper
2010-08-02 14:50         ` Avi Kivity
2010-08-02 15:08       ` Jeremy Fitzhardinge
2010-07-26  6:15 ` [PATCH RFC 3/4] Paravirtualized spinlock implementation " Srivatsa Vaddagiri
2010-08-02  8:48   ` Avi Kivity [this message]
2010-08-02 15:20     ` Jeremy Fitzhardinge
2010-08-03  6:59       ` Avi Kivity
2010-08-03 17:47         ` Jeremy Fitzhardinge
2010-08-02  8:53   ` Avi Kivity
2010-07-26  6:16 ` [PATCH RFC 4/4] Add yield hypercall support in Qemu Srivatsa Vaddagiri
2010-07-26 17:18 ` [PATCH RFC 0/4] Paravirt-spinlock implementation for KVM guests (Version 0) Jeremy Fitzhardinge
2010-07-28 14:47   ` Srivatsa Vaddagiri
2010-07-28 22:10 ` Konrad Rzeszutek Wilk
2010-07-28 22:42   ` Konrad Rzeszutek Wilk
2010-08-02  8:50 ` Avi Kivity

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=4C568669.40001@redhat.com \
    --to=avi@redhat.com \
    --cc=JBeulich@novell.com \
    --cc=balbir@in.ibm.com \
    --cc=bharata@in.ibm.com \
    --cc=gleb@redhat.com \
    --cc=jeremy@goop.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=npiggin@suse.de \
    --cc=vatsa@linux.vnet.ibm.com \
    /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