aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/tile/lib/spinlock_32.c11
-rw-r--r--arch/tile/lib/spinlock_64.c11
2 files changed, 20 insertions, 2 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
diff --git a/arch/tile/lib/spinlock_64.c b/arch/tile/lib/spinlock_64.c
index d6fb9581e980..c8d1f94ff1fe 100644
--- a/arch/tile/lib/spinlock_64.c
+++ b/arch/tile/lib/spinlock_64.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 u32 val = READ_ONCE(lock->lock);
69 u32 curr = arch_spin_current(val);
70
71 /* Return immediately if unlocked. */
72 if (arch_spin_next(val) == 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 (arch_spin_current(READ_ONCE(lock->lock)) == curr);
70} 79}
71EXPORT_SYMBOL(arch_spin_unlock_wait); 80EXPORT_SYMBOL(arch_spin_unlock_wait);
72 81