diff options
Diffstat (limited to 'include/linux/spinlock_up.h')
| -rw-r--r-- | include/linux/spinlock_up.h | 10 | 
1 files changed, 7 insertions, 3 deletions
| diff --git a/include/linux/spinlock_up.h b/include/linux/spinlock_up.h index 8b3ac0d718eb..0d9848de677d 100644 --- a/include/linux/spinlock_up.h +++ b/include/linux/spinlock_up.h @@ -6,6 +6,7 @@  #endif  #include <asm/processor.h>	/* for cpu_relax() */ +#include <asm/barrier.h>  /*   * include/linux/spinlock_up.h - UP-debug version of spinlocks. @@ -25,6 +26,11 @@  #ifdef CONFIG_DEBUG_SPINLOCK  #define arch_spin_is_locked(x)		((x)->slock == 0) +static inline void arch_spin_unlock_wait(arch_spinlock_t *lock) +{ +	smp_cond_load_acquire(&lock->slock, VAL); +} +  static inline void arch_spin_lock(arch_spinlock_t *lock)  {  	lock->slock = 0; @@ -67,6 +73,7 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)  #else /* DEBUG_SPINLOCK */  #define arch_spin_is_locked(lock)	((void)(lock), 0) +#define arch_spin_unlock_wait(lock)	do { barrier(); (void)(lock); } while (0)  /* for sched/core.c and kernel_lock.c: */  # define arch_spin_lock(lock)		do { barrier(); (void)(lock); } while (0)  # define arch_spin_lock_flags(lock, flags)	do { barrier(); (void)(lock); } while (0) @@ -79,7 +86,4 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)  #define arch_read_can_lock(lock)	(((void)(lock), 1))  #define arch_write_can_lock(lock)	(((void)(lock), 1)) -#define arch_spin_unlock_wait(lock) \ -		do { cpu_relax(); } while (arch_spin_is_locked(lock)) -  #endif /* __LINUX_SPINLOCK_UP_H */ |