diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2008-07-07 15:07:51 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-16 05:15:53 -0400 |
commit | 8efcbab674de2bee45a2e4cdf97de16b8e609ac8 (patch) | |
tree | 1b45a9446e471bfdba21e7982c87aef47d2f8313 /include/asm-x86/paravirt.h | |
parent | 74d4affde8feb8d5bdebf7fba8e90e4eae3b7b1d (diff) |
paravirt: introduce a "lock-byte" spinlock implementation
Implement a version of the old spinlock algorithm, in which everyone
spins waiting for a lock byte. In order to be compatible with the
ticket-lock's use of a zero initializer, this uses the convention of
'0' for unlocked and '1' for locked.
This algorithm is much better than ticket locks in a virtual
envionment, because it doesn't interact badly with the vcpu scheduler.
If there are multiple vcpus spinning on a lock and the lock is
released, the next vcpu to be scheduled will take the lock, rather
than cycling around until the next ticketed vcpu gets it.
To use this, you must call paravirt_use_bytelocks() very early, before
any spinlocks have been taken.
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>
Diffstat (limited to 'include/asm-x86/paravirt.h')
-rw-r--r-- | include/asm-x86/paravirt.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index feb6bb66c5e2..65ed02cdbbd7 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
@@ -1385,6 +1385,8 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, | |||
1385 | void _paravirt_nop(void); | 1385 | void _paravirt_nop(void); |
1386 | #define paravirt_nop ((void *)_paravirt_nop) | 1386 | #define paravirt_nop ((void *)_paravirt_nop) |
1387 | 1387 | ||
1388 | void paravirt_use_bytelocks(void); | ||
1389 | |||
1388 | static inline int __raw_spin_is_locked(struct raw_spinlock *lock) | 1390 | static inline int __raw_spin_is_locked(struct raw_spinlock *lock) |
1389 | { | 1391 | { |
1390 | return PVOP_CALL1(int, pv_lock_ops.spin_is_locked, lock); | 1392 | return PVOP_CALL1(int, pv_lock_ops.spin_is_locked, lock); |