From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
Christoph Lameter <clameter@sgi.com>,
Petr Tesarik <ptesarik@suse.cz>, Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org,
Nick Piggin <nickpiggin@yahoo.com.au>
Subject: Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoid spin with irqs disable
Date: Thu, 26 Jun 2008 08:49:37 -0700 [thread overview]
Message-ID: <4863BA91.2060402@goop.org> (raw)
In-Reply-To: <1214463060.3035.12.camel@twins.programming.kicks-ass.net>
Peter Zijlstra wrote:
> Paravirt spinlocks sounds like a good idea anyway, that way you can make
> them scheduling locks (from the host's POV) when the lock owner (vcpu)
> isn't running.
>
> Burning time spinning on !running vcpus seems like a waste to me.
>
In theory. But in practice Linux locks are so low-contention that not
much time seems to get wasted. I've been doing experiments with
spin-a-while-then-block locks, but they never got to the -then-block
part in my test. The burning cycles spinning only gets expensive if the
lock-holder vcpu gets preempted, and there's other cpus spinning on that
lock; but if locks are held only briefly, then there's little chance
being preempted while holding the lock.
At least that's at the scale I've been testing, with only two cores. I
expect things look different with 8 or 16 cores and similarly scaled guests.
> As for the scheduler solving the unfairness that ticket locks solve,
>
No, I never said scheduler would the problem, merely mitigate it.
> that cannot be done. The ticket lock solves intra-cpu fairness for a
> resource other than time. The cpu scheduler only cares about fairness in
> time, and its intra-cpu fairness is on a larger scale than most spinlock
> hold times - so even if time and the locked resource would overlap it
> wouldn't work.
>
> The simple scenario is running N tasks on N cpus that all pound the same
> lock, cache issues will make it unlikely the lock would migrate away
> from whatever cpu its on, essentially starving all the other N-1 cpus.
>
Yep. But in practice, the scheduler will steal the real cpu from under
the vcpu dominating the lock and upset the pathalogical pattern. I'm
not saying its ideal, but the starvation case that ticketlocks solve is
pretty rare in the large scheme of things.
Also, ticket locks don't help either, if the lock is always
transitioning between locked->unlocked->locked on all cpus. It only
helps in the case of one cpu doing rapid lock->unlock transitions while
others wait on the lock.
> Ticket locks solve that exact issue, all the scheduler can do is ensure
> they're all spending an equal amount of time on the cpu, whether that is
> spinning for lock acquisition or getting actual work done is beyond its
> scope.
>
Yes. But the problem with ticket locks is that they dictate a
scheduling order, and if you fail to schedule in that order vast amounts
of time are wasted. You can get into this state:
1. vcpu A takes a lock
2. vcpu A is preempted, effectively making a 5us lock be held for 30ms
3. vcpus E,D,C,B try to take the lock in that order
4. they all spin, wasting time. bad, but no worse than the old lock
algorithm
5. vcpu A eventually runs again and releases the lock
6. vcpu B runs, spinning until preempted
7. vcpu C runs, spinning until preempted
8. vcpu D runs, spinning until preempted
9. vcpu E runs, and takes the lock and releases it
10. (repeat spinning on B,C,D until D gets the lock)
11. (repeat spinning on B,C until C gets the lock)
12. B finally gets the lock
Steps 6-12 are all caused by ticket locks, and the situation is
exacerbated by vcpus F-Z trying to get the lock in the meantime while
its all tangled up handing out tickets in the right order.
The problem is that the old lock-byte locks made no fairness guarantees,
and interacted badly with the hardware causing severe starvation in some
cases. Ticket locks are too fair, and absolutely dictate the order in
which the lock is taken. Really, all that's needed is the weaker
assertion that "when I release the lock, any current spinner should get
the lock".
J
next prev parent reply other threads:[~2008-06-26 15:50 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-06 19:26 Spinlocks waiting with interrupts disabled / preempt disabled Christoph Lameter
2008-05-07 7:30 ` Ingo Molnar
2008-05-07 17:04 ` Christoph Lameter
2008-05-07 17:24 ` Christoph Lameter
2008-05-07 18:49 ` Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoid spin with irqs disable Christoph Lameter
2008-05-09 10:26 ` Ingo Molnar
2008-05-09 16:28 ` Christoph Lameter
2008-06-23 17:19 ` Petr Tesarik
2008-06-23 17:54 ` Peter Zijlstra
2008-06-23 18:20 ` Christoph Lameter
2008-06-23 20:39 ` Peter Zijlstra
2008-06-23 20:45 ` Christoph Lameter
2008-06-23 20:58 ` Peter Zijlstra
2008-06-26 2:51 ` Jeremy Fitzhardinge
2008-06-26 6:51 ` Peter Zijlstra
2008-06-26 15:49 ` Jeremy Fitzhardinge [this message]
2008-06-26 9:17 ` Petr Tesarik
2008-06-26 17:02 ` Christoph Lameter
2008-06-26 17:48 ` Peter Zijlstra
2008-07-07 11:50 ` Nick Piggin
2008-07-07 11:52 ` Nick Piggin
2008-07-07 15:56 ` Jeremy Fitzhardinge
2008-07-08 2:08 ` Nick Piggin
2008-07-07 15:53 ` Jeremy Fitzhardinge
2008-07-07 19:46 ` Rik van Riel
2008-07-07 20:14 ` Jeremy Fitzhardinge
2008-07-08 2:07 ` Nick Piggin
2008-07-08 5:57 ` Jeremy Fitzhardinge
2008-07-08 8:41 ` Nick Piggin
2008-07-08 15:58 ` Jeremy Fitzhardinge
2008-05-09 16:35 ` Spinlocks waiting with interrupts disabled / preempt disabled Olaf Weber
2008-05-09 17:56 ` Peter Zijlstra
2008-05-09 18:00 ` Christoph Lameter
2008-05-09 18:06 ` Peter Zijlstra
2008-05-09 20:01 ` Olaf Weber
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=4863BA91.2060402@goop.org \
--to=jeremy@goop.org \
--cc=a.p.zijlstra@chello.nl \
--cc=clameter@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=nickpiggin@yahoo.com.au \
--cc=peterz@infradead.org \
--cc=ptesarik@suse.cz \
/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