Lines Matching refs:lock
83 static inline bool pv_hybrid_queued_unfair_trylock(struct qspinlock *lock) in pv_hybrid_queued_unfair_trylock() argument
90 int val = atomic_read(&lock->val); in pv_hybrid_queued_unfair_trylock()
93 (cmpxchg_acquire(&lock->locked, 0, _Q_LOCKED_VAL) == 0)) { in pv_hybrid_queued_unfair_trylock()
111 static __always_inline void set_pending(struct qspinlock *lock) in set_pending() argument
113 WRITE_ONCE(lock->pending, 1); in set_pending()
121 static __always_inline int trylock_clear_pending(struct qspinlock *lock) in trylock_clear_pending() argument
123 return !READ_ONCE(lock->locked) && in trylock_clear_pending()
124 (cmpxchg_acquire(&lock->locked_pending, _Q_PENDING_VAL, in trylock_clear_pending()
128 static __always_inline void set_pending(struct qspinlock *lock) in set_pending() argument
130 atomic_or(_Q_PENDING_VAL, &lock->val); in set_pending()
133 static __always_inline int trylock_clear_pending(struct qspinlock *lock) in trylock_clear_pending() argument
135 int val = atomic_read(&lock->val); in trylock_clear_pending()
148 val = atomic_cmpxchg_acquire(&lock->val, old, new); in trylock_clear_pending()
174 struct qspinlock *lock; member
214 static struct qspinlock **pv_hash(struct qspinlock *lock, struct pv_node *node) in pv_hash() argument
216 unsigned long offset, hash = hash_ptr(lock, pv_lock_hash_bits); in pv_hash()
222 if (!cmpxchg(&he->lock, NULL, lock)) { in pv_hash()
225 return &he->lock; in pv_hash()
241 static struct pv_node *pv_unhash(struct qspinlock *lock) in pv_unhash() argument
243 unsigned long offset, hash = hash_ptr(lock, pv_lock_hash_bits); in pv_unhash()
248 if (READ_ONCE(he->lock) == lock) { in pv_unhash()
250 WRITE_ONCE(he->lock, NULL); in pv_unhash()
361 static void pv_kick_node(struct qspinlock *lock, struct mcs_spinlock *node) in pv_kick_node() argument
392 WRITE_ONCE(lock->locked, _Q_SLOW_VAL); in pv_kick_node()
393 (void)pv_hash(lock, pn); in pv_kick_node()
404 pv_wait_head_or_lock(struct qspinlock *lock, struct mcs_spinlock *node) in pv_wait_head_or_lock() argument
434 set_pending(lock); in pv_wait_head_or_lock()
436 if (trylock_clear_pending(lock)) in pv_wait_head_or_lock()
440 clear_pending(lock); in pv_wait_head_or_lock()
444 lp = pv_hash(lock, pn); in pv_wait_head_or_lock()
457 if (xchg(&lock->locked, _Q_SLOW_VAL) == 0) { in pv_wait_head_or_lock()
463 WRITE_ONCE(lock->locked, _Q_LOCKED_VAL); in pv_wait_head_or_lock()
471 pv_wait(&lock->locked, _Q_SLOW_VAL); in pv_wait_head_or_lock()
486 return (u32)(atomic_read(&lock->val) | _Q_LOCKED_VAL); in pv_wait_head_or_lock()
494 __pv_queued_spin_unlock_slowpath(struct qspinlock *lock, u8 locked) in __pv_queued_spin_unlock_slowpath() argument
501 (unsigned long)lock, atomic_read(&lock->val)); in __pv_queued_spin_unlock_slowpath()
518 node = pv_unhash(lock); in __pv_queued_spin_unlock_slowpath()
524 smp_store_release(&lock->locked, 0); in __pv_queued_spin_unlock_slowpath()
548 __visible void __pv_queued_spin_unlock(struct qspinlock *lock) in __pv_queued_spin_unlock() argument
557 locked = cmpxchg_release(&lock->locked, _Q_LOCKED_VAL, 0); in __pv_queued_spin_unlock()
561 __pv_queued_spin_unlock_slowpath(lock, locked); in __pv_queued_spin_unlock()