Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef __LINUX_OSQ_LOCK_H
0003 #define __LINUX_OSQ_LOCK_H
0004 
0005 /*
0006  * An MCS like lock especially tailored for optimistic spinning for sleeping
0007  * lock implementations (mutex, rwsem, etc).
0008  */
0009 struct optimistic_spin_node {
0010     struct optimistic_spin_node *next, *prev;
0011     int locked; /* 1 if lock acquired */
0012     int cpu; /* encoded CPU # + 1 value */
0013 };
0014 
0015 struct optimistic_spin_queue {
0016     /*
0017      * Stores an encoded value of the CPU # of the tail node in the queue.
0018      * If the queue is empty, then it's set to OSQ_UNLOCKED_VAL.
0019      */
0020     atomic_t tail;
0021 };
0022 
0023 #define OSQ_UNLOCKED_VAL (0)
0024 
0025 /* Init macro and function. */
0026 #define OSQ_LOCK_UNLOCKED { ATOMIC_INIT(OSQ_UNLOCKED_VAL) }
0027 
0028 static inline void osq_lock_init(struct optimistic_spin_queue *lock)
0029 {
0030     atomic_set(&lock->tail, OSQ_UNLOCKED_VAL);
0031 }
0032 
0033 extern bool osq_lock(struct optimistic_spin_queue *lock);
0034 extern void osq_unlock(struct optimistic_spin_queue *lock);
0035 
0036 static inline bool osq_is_locked(struct optimistic_spin_queue *lock)
0037 {
0038     return atomic_read(&lock->tail) != OSQ_UNLOCKED_VAL;
0039 }
0040 
0041 #endif