Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoid spin with irqs disable

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Peter Zijlstra <peterz@...>
Cc: Peter Zijlstra <a.p.zijlstra@...>, Christoph Lameter <clameter@...>, Petr Tesarik <ptesarik@...>, Ingo Molnar <mingo@...>, <linux-kernel@...>, Nick Piggin <nickpiggin@...>
Date: Thursday, June 26, 2008 - 11:49 am

Peter Zijlstra wrote:

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.


No, I never said scheduler would the problem, merely mitigate it.


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.


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

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Christoph Lameter, (Mon Jun 23, 2:20 pm)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Christoph Lameter, (Mon Jun 23, 4:45 pm)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Jeremy Fitzhardinge, (Wed Jun 25, 10:51 pm)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Jeremy Fitzhardinge, (Mon Jul 7, 4:14 pm)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Jeremy Fitzhardinge, (Tue Jul 8, 1:57 am)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Jeremy Fitzhardinge, (Tue Jul 8, 11:58 am)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Jeremy Fitzhardinge, (Mon Jul 7, 11:53 am)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Jeremy Fitzhardinge, (Mon Jul 7, 11:56 am)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Christoph Lameter, (Thu Jun 26, 1:02 pm)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Jeremy Fitzhardinge, (Thu Jun 26, 11:49 am)
Re: Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoi..., Christoph Lameter, (Fri May 9, 12:28 pm)