aboutsummaryrefslogtreecommitdiffstats
path: root/arch/tile/lib/spinlock_32.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/tile/lib/spinlock_32.c')
-rw-r--r--arch/tile/lib/spinlock_32.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/tile/lib/spinlock_32.c b/arch/tile/lib/spinlock_32.c
index b34f79aada48..88c2a53362e7 100644
--- a/arch/tile/lib/spinlock_32.c
+++ b/arch/tile/lib/spinlock_32.c
@@ -65,8 +65,17 @@ EXPORT_SYMBOL(arch_spin_trylock);
65void arch_spin_unlock_wait(arch_spinlock_t *lock) 65void arch_spin_unlock_wait(arch_spinlock_t *lock)
66{ 66{
67 u32 iterations = 0; 67 u32 iterations = 0;
68 while (arch_spin_is_locked(lock)) 68 int curr = READ_ONCE(lock->current_ticket);
69 int next = READ_ONCE(lock->next_ticket);
70
71 /* Return immediately if unlocked. */
72 if (next == curr)
73 return;
74
75 /* Wait until the current locker has released the lock. */
76 do {
69 delay_backoff(iterations++); 77 delay_backoff(iterations++);
78 } while (READ_ONCE(lock->current_ticket) == curr);
70} 79}
71EXPORT_SYMBOL(arch_spin_unlock_wait); 80EXPORT_SYMBOL(arch_spin_unlock_wait);
72 81