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