• J
    xen: implement Xen-specific spinlocks · 2d9e1e2f
    Jeremy Fitzhardinge 提交于
    The standard ticket spinlocks are very expensive in a virtual
    environment, because their performance depends on Xen's scheduler
    giving vcpus time in the order that they're supposed to take the
    spinlock.
    
    This implements a Xen-specific spinlock, which should be much more
    efficient.
    
    The fast-path is essentially the old Linux-x86 locks, using a single
    lock byte.  The locker decrements the byte; if the result is 0, then
    they have the lock.  If the lock is negative, then locker must spin
    until the lock is positive again.
    
    When there's contention, the locker spin for 2^16[*] iterations waiting
    to get the lock.  If it fails to get the lock in that time, it adds
    itself to the contention count in the lock and blocks on a per-cpu
    event channel.
    
    When unlocking the spinlock, the locker looks to see if there's anyone
    blocked waiting for the lock by checking for a non-zero waiter count.
    If there's a waiter, it traverses the per-cpu "lock_spinners"
    variable, which contains which lock each CPU is waiting on.  It picks
    one CPU waiting on the lock and sends it an event to wake it up.
    
    This allows efficient fast-path spinlock operation, while allowing
    spinning vcpus to give up their processor time while waiting for a
    contended lock.
    
    [*] 2^16 iterations is threshold at which 98% locks have been taken
    according to Thomas Friebel's Xen Summit talk "Preventing Guests from
    Spinning Around".  Therefore, we'd expect the lock and unlock slow
    paths will only be entered 2% of the time.
    Signed-off-by: NJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Christoph Lameter <clameter@linux-foundation.org>
    Cc: Petr Tesarik <ptesarik@suse.cz>
    Cc: Virtualization <virtualization@lists.linux-foundation.org>
    Cc: Xen devel <xen-devel@lists.xensource.com>
    Cc: Thomas Friebel <thomas.friebel@amd.com>
    Cc: Nick Piggin <nickpiggin@yahoo.com.au>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    2d9e1e2f
events.c 18.8 KB