linux/arch/x86/xen
Jeremy Fitzhardinge 2d9e1e2f58 xen: implement Xen-specific spinlocks
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: Jeremy 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: Ingo Molnar <mingo@elte.hu>
2008-07-16 11:15:53 +02:00
..
enlighten.c xen64: fix build error on 32-bit + !HIGHMEM 2008-07-16 11:07:02 +02:00
grant-table.c xen: make grant table arch portable 2008-04-24 23:57:32 +02:00
Kconfig xen: update Kconfig to allow 64-bit Xen 2008-07-16 11:06:34 +02:00
Makefile xen64: add 64-bit assembler 2008-07-16 10:59:09 +02:00
mmu.c xen64: allocate and manage user pagetables 2008-07-16 11:05:38 +02:00
mmu.h xen64: allocate and manage user pagetables 2008-07-16 11:05:38 +02:00
multicalls.c xen: print backtrace on multicall failure 2008-07-16 10:55:21 +02:00
multicalls.h xen: add mechanism to extend existing multicalls 2008-06-25 15:17:34 +02:00
setup.c x86: xen: no need to disable vdso32 2008-07-16 11:08:44 +02:00
smp.c xen: implement Xen-specific spinlocks 2008-07-16 11:15:53 +02:00
suspend.c xen: add xen_arch_resume()/xen_timer_resume hook for ia64 support 2008-07-16 10:55:50 +02:00
time.c x86: rename paravirtualized TSC functions 2008-07-09 07:43:28 +02:00
vdso.h
xen-asm_32.S xen64: add 64-bit assembler 2008-07-16 10:59:09 +02:00
xen-asm_64.S xen64: set up syscall and sysenter entrypoints for 64-bit 2008-07-16 11:05:52 +02:00
xen-head.S xen64: add xen-head code to head_64.S 2008-07-16 10:58:41 +02:00
xen-ops.h xen64: set up syscall and sysenter entrypoints for 64-bit 2008-07-16 11:05:52 +02:00