Lines Matching refs:lock

47 static inline void __ticket_enter_slowpath(arch_spinlock_t *lock)  in __ticket_enter_slowpath()  argument
49 set_bit(0, (volatile unsigned long *)&lock->tickets.head); in __ticket_enter_slowpath()
53 static __always_inline void __ticket_lock_spinning(arch_spinlock_t *lock, in __ticket_lock_spinning() argument
57 static inline void __ticket_unlock_kick(arch_spinlock_t *lock, in __ticket_unlock_kick() argument
68 static inline void __ticket_check_and_clear_slowpath(arch_spinlock_t *lock, in __ticket_check_and_clear_slowpath() argument
80 cmpxchg(&lock->head_tail, old.head_tail, new.head_tail); in __ticket_check_and_clear_slowpath()
84 static __always_inline int arch_spin_value_unlocked(arch_spinlock_t lock) in arch_spin_value_unlocked() argument
86 return __tickets_equal(lock.tickets.head, lock.tickets.tail); in arch_spin_value_unlocked()
102 static __always_inline void arch_spin_lock(arch_spinlock_t *lock) in arch_spin_lock() argument
106 inc = xadd(&lock->tickets, inc); in arch_spin_lock()
114 inc.head = READ_ONCE(lock->tickets.head); in arch_spin_lock()
119 __ticket_lock_spinning(lock, inc.tail); in arch_spin_lock()
122 __ticket_check_and_clear_slowpath(lock, inc.head); in arch_spin_lock()
127 static __always_inline int arch_spin_trylock(arch_spinlock_t *lock) in arch_spin_trylock() argument
131 old.tickets = READ_ONCE(lock->tickets); in arch_spin_trylock()
139 return cmpxchg(&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail; in arch_spin_trylock()
142 static __always_inline void arch_spin_unlock(arch_spinlock_t *lock) in arch_spin_unlock() argument
150 head = xadd(&lock->tickets.head, TICKET_LOCK_INC); in arch_spin_unlock()
154 __ticket_unlock_kick(lock, (head + TICKET_LOCK_INC)); in arch_spin_unlock()
157 __add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX); in arch_spin_unlock()
160 static inline int arch_spin_is_locked(arch_spinlock_t *lock) in arch_spin_is_locked() argument
162 struct __raw_tickets tmp = READ_ONCE(lock->tickets); in arch_spin_is_locked()
167 static inline int arch_spin_is_contended(arch_spinlock_t *lock) in arch_spin_is_contended() argument
169 struct __raw_tickets tmp = READ_ONCE(lock->tickets); in arch_spin_is_contended()
176 static __always_inline void arch_spin_lock_flags(arch_spinlock_t *lock, in arch_spin_lock_flags() argument
179 arch_spin_lock(lock); in arch_spin_lock_flags()
182 static inline void arch_spin_unlock_wait(arch_spinlock_t *lock) in arch_spin_unlock_wait() argument
184 __ticket_t head = READ_ONCE(lock->tickets.head); in arch_spin_unlock_wait()
187 struct __raw_tickets tmp = READ_ONCE(lock->tickets); in arch_spin_unlock_wait()
216 #define arch_read_lock_flags(lock, flags) arch_read_lock(lock) argument
217 #define arch_write_lock_flags(lock, flags) arch_write_lock(lock) argument
219 #define arch_spin_relax(lock) cpu_relax() argument
220 #define arch_read_relax(lock) cpu_relax() argument
221 #define arch_write_relax(lock) cpu_relax() argument