[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 13/20] x86/pvticketlock: make sure unlock is seen by everyone before checking waiters
From: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx> If we don't put a real memory barrier between the unlocking increment of the queue head and the check for lock waiters, we can end up with a deadlock as a result of the unload write being reordered with respect to the waiters read. In effect, the check on the waiters count could happen before the unlock, which leads to a deadlock: unlocker locker check waiters (none) check lock head (timeout) add to waiters block release lock => deadlock Adding a mb() barrier prevents the unlocker's waiter check from happening before the lock release. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx> --- arch/x86/include/asm/spinlock.h | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h index 3deabca..b9a1aae 100644 --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h @@ -88,6 +88,13 @@ static inline void __ticket_sub_waiting(struct arch_spinlock *lock) static __always_inline bool __ticket_lock_waiters(const struct arch_spinlock *lock) { + /* + * Make sure everyone sees the unlock write before we check the + * waiting count. The processor ordering doesn't guarantee this + * because they're different memory locations. + */ + mb(); + return ACCESS_ONCE(lock->waiting) != 0; } #endif /* CONFIG_PARAVIRT_SPINLOCKS */ -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |