Lines Matching full:lock
6 * Simple spin lock operations.
34 static __always_inline int arch_spin_value_unlocked(arch_spinlock_t lock) in arch_spin_value_unlocked() argument
36 return lock.slock == 0; in arch_spin_value_unlocked()
39 static inline int arch_spin_is_locked(arch_spinlock_t *lock) in arch_spin_is_locked() argument
41 return !arch_spin_value_unlocked(READ_ONCE(*lock)); in arch_spin_is_locked()
45 * This returns the old value in the lock, so we succeeded
46 * in getting the lock if the return value is 0.
48 static inline unsigned long __arch_spin_trylock(arch_spinlock_t *lock) in __arch_spin_trylock() argument
62 : "r" (token), "r" (&lock->slock) in __arch_spin_trylock()
68 static inline int arch_spin_trylock(arch_spinlock_t *lock) in arch_spin_trylock() argument
70 return __arch_spin_trylock(lock) == 0; in arch_spin_trylock()
76 * there is no point spinning on a lock if the holder of the lock
79 * rest of our timeslice to the lock holder.
81 * So that we can tell which virtual processor is holding a lock,
82 * we put 0x80000000 | smp_processor_id() in the lock when it is
89 void splpar_spin_yield(arch_spinlock_t *lock);
90 void splpar_rw_yield(arch_rwlock_t *lock);
92 static inline void splpar_spin_yield(arch_spinlock_t *lock) {} in splpar_spin_yield() argument
93 static inline void splpar_rw_yield(arch_rwlock_t *lock) {} in splpar_rw_yield() argument
96 static inline void spin_yield(arch_spinlock_t *lock) in spin_yield() argument
99 splpar_spin_yield(lock); in spin_yield()
104 static inline void rw_yield(arch_rwlock_t *lock) in rw_yield() argument
107 splpar_rw_yield(lock); in rw_yield()
112 static inline void arch_spin_lock(arch_spinlock_t *lock) in arch_spin_lock() argument
115 if (likely(__arch_spin_trylock(lock) == 0)) in arch_spin_lock()
120 splpar_spin_yield(lock); in arch_spin_lock()
121 } while (unlikely(lock->slock != 0)); in arch_spin_lock()
127 void arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags) in arch_spin_lock_flags() argument
132 if (likely(__arch_spin_trylock(lock) == 0)) in arch_spin_lock_flags()
139 splpar_spin_yield(lock); in arch_spin_lock_flags()
140 } while (unlikely(lock->slock != 0)); in arch_spin_lock_flags()
147 static inline void arch_spin_unlock(arch_spinlock_t *lock) in arch_spin_unlock() argument
151 lock->slock = 0; in arch_spin_unlock()
161 * irq-safe write-lock, but readers can get non-irqsafe
174 * This returns the old value in the lock + 1,
175 * so we got a read lock if the return value is > 0.
190 : "r" (&rw->lock) in __arch_read_trylock()
197 * This returns the old value in the lock,
198 * so we got the write lock if the return value is 0.
213 : "r" (token), "r" (&rw->lock) in __arch_write_trylock()
228 } while (unlikely(rw->lock < 0)); in arch_read_lock()
242 } while (unlikely(rw->lock != 0)); in arch_write_lock()
269 : "r"(&rw->lock) in arch_read_unlock()
277 rw->lock = 0; in arch_write_unlock()
280 #define arch_spin_relax(lock) spin_yield(lock) argument
281 #define arch_read_relax(lock) rw_yield(lock) argument
282 #define arch_write_relax(lock) rw_yield(lock) argument