0001
0002 #ifndef __LINUX_OSQ_LOCK_H
0003 #define __LINUX_OSQ_LOCK_H
0004
0005
0006
0007
0008
0009 struct optimistic_spin_node {
0010 struct optimistic_spin_node *next, *prev;
0011 int locked;
0012 int cpu;
0013 };
0014
0015 struct optimistic_spin_queue {
0016
0017
0018
0019
0020 atomic_t tail;
0021 };
0022
0023 #define OSQ_UNLOCKED_VAL (0)
0024
0025
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