18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef __LINUX_OSQ_LOCK_H 38c2ecf20Sopenharmony_ci#define __LINUX_OSQ_LOCK_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci/* 68c2ecf20Sopenharmony_ci * An MCS like lock especially tailored for optimistic spinning for sleeping 78c2ecf20Sopenharmony_ci * lock implementations (mutex, rwsem, etc). 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_cistruct optimistic_spin_node { 108c2ecf20Sopenharmony_ci struct optimistic_spin_node *next, *prev; 118c2ecf20Sopenharmony_ci int locked; /* 1 if lock acquired */ 128c2ecf20Sopenharmony_ci int cpu; /* encoded CPU # + 1 value */ 138c2ecf20Sopenharmony_ci}; 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistruct optimistic_spin_queue { 168c2ecf20Sopenharmony_ci /* 178c2ecf20Sopenharmony_ci * Stores an encoded value of the CPU # of the tail node in the queue. 188c2ecf20Sopenharmony_ci * If the queue is empty, then it's set to OSQ_UNLOCKED_VAL. 198c2ecf20Sopenharmony_ci */ 208c2ecf20Sopenharmony_ci atomic_t tail; 218c2ecf20Sopenharmony_ci}; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define OSQ_UNLOCKED_VAL (0) 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci/* Init macro and function. */ 268c2ecf20Sopenharmony_ci#define OSQ_LOCK_UNLOCKED { ATOMIC_INIT(OSQ_UNLOCKED_VAL) } 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic inline void osq_lock_init(struct optimistic_spin_queue *lock) 298c2ecf20Sopenharmony_ci{ 308c2ecf20Sopenharmony_ci atomic_set(&lock->tail, OSQ_UNLOCKED_VAL); 318c2ecf20Sopenharmony_ci} 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ciextern bool osq_lock(struct optimistic_spin_queue *lock); 348c2ecf20Sopenharmony_ciextern void osq_unlock(struct optimistic_spin_queue *lock); 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistatic inline bool osq_is_locked(struct optimistic_spin_queue *lock) 378c2ecf20Sopenharmony_ci{ 388c2ecf20Sopenharmony_ci return atomic_read(&lock->tail) != OSQ_UNLOCKED_VAL; 398c2ecf20Sopenharmony_ci} 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci#endif 42