~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/asm-generic/qrwlock.h

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /include/asm-generic/qrwlock.h (Version linux-6.12-rc7) and /include/asm-alpha/qrwlock.h (Version linux-4.20.17)


  1 /* SPDX-License-Identifier: GPL-2.0-or-later *      1 
  2 /*                                                
  3  * Queue read/write lock                          
  4  *                                                
  5  * These use generic atomic and locking routin    
  6  * implementation in order to be fair themselv    
  7  * asm-generic/spinlock.h meets these requirem    
  8  *                                                
  9  * (C) Copyright 2013-2014 Hewlett-Packard Dev    
 10  *                                                
 11  * Authors: Waiman Long <waiman.long@hp.com>      
 12  */                                               
 13 #ifndef __ASM_GENERIC_QRWLOCK_H                   
 14 #define __ASM_GENERIC_QRWLOCK_H                   
 15                                                   
 16 #include <linux/atomic.h>                         
 17 #include <asm/barrier.h>                          
 18 #include <asm/processor.h>                        
 19                                                   
 20 #include <asm-generic/qrwlock_types.h>            
 21                                                   
 22 /* Must be included from asm/spinlock.h after     
 23                                                   
 24 /*                                                
 25  * Writer states & reader shift and bias.         
 26  */                                               
 27 #define _QW_WAITING     0x100           /* A w    
 28 #define _QW_LOCKED      0x0ff           /* A w    
 29 #define _QW_WMASK       0x1ff           /* Wri    
 30 #define _QR_SHIFT       9               /* Rea    
 31 #define _QR_BIAS        (1U << _QR_SHIFT)         
 32                                                   
 33 /*                                                
 34  * External function declarations                 
 35  */                                               
 36 extern void queued_read_lock_slowpath(struct q    
 37 extern void queued_write_lock_slowpath(struct     
 38                                                   
 39 /**                                               
 40  * queued_read_trylock - try to acquire read l    
 41  * @lock : Pointer to queued rwlock structure     
 42  * Return: 1 if lock acquired, 0 if failed        
 43  */                                               
 44 static inline int queued_read_trylock(struct q    
 45 {                                                 
 46         int cnts;                                 
 47                                                   
 48         cnts = atomic_read(&lock->cnts);          
 49         if (likely(!(cnts & _QW_WMASK))) {        
 50                 cnts = (u32)atomic_add_return_    
 51                 if (likely(!(cnts & _QW_WMASK)    
 52                         return 1;                 
 53                 atomic_sub(_QR_BIAS, &lock->cn    
 54         }                                         
 55         return 0;                                 
 56 }                                                 
 57                                                   
 58 /**                                               
 59  * queued_write_trylock - try to acquire write    
 60  * @lock : Pointer to queued rwlock structure     
 61  * Return: 1 if lock acquired, 0 if failed        
 62  */                                               
 63 static inline int queued_write_trylock(struct     
 64 {                                                 
 65         int cnts;                                 
 66                                                   
 67         cnts = atomic_read(&lock->cnts);          
 68         if (unlikely(cnts))                       
 69                 return 0;                         
 70                                                   
 71         return likely(atomic_try_cmpxchg_acqui    
 72                                 _QW_LOCKED));     
 73 }                                                 
 74 /**                                               
 75  * queued_read_lock - acquire read lock of a q    
 76  * @lock: Pointer to queued rwlock structure      
 77  */                                               
 78 static inline void queued_read_lock(struct qrw    
 79 {                                                 
 80         int cnts;                                 
 81                                                   
 82         cnts = atomic_add_return_acquire(_QR_B    
 83         if (likely(!(cnts & _QW_WMASK)))          
 84                 return;                           
 85                                                   
 86         /* The slowpath will decrement the rea    
 87         queued_read_lock_slowpath(lock);          
 88 }                                                 
 89                                                   
 90 /**                                               
 91  * queued_write_lock - acquire write lock of a    
 92  * @lock : Pointer to queued rwlock structure     
 93  */                                               
 94 static inline void queued_write_lock(struct qr    
 95 {                                                 
 96         int cnts = 0;                             
 97         /* Optimize for the unfair lock case w    
 98         if (likely(atomic_try_cmpxchg_acquire(    
 99                 return;                           
100                                                   
101         queued_write_lock_slowpath(lock);         
102 }                                                 
103                                                   
104 /**                                               
105  * queued_read_unlock - release read lock of a    
106  * @lock : Pointer to queued rwlock structure     
107  */                                               
108 static inline void queued_read_unlock(struct q    
109 {                                                 
110         /*                                        
111          * Atomically decrement the reader cou    
112          */                                       
113         (void)atomic_sub_return_release(_QR_BI    
114 }                                                 
115                                                   
116 /**                                               
117  * queued_write_unlock - release write lock of    
118  * @lock : Pointer to queued rwlock structure     
119  */                                               
120 static inline void queued_write_unlock(struct     
121 {                                                 
122         smp_store_release(&lock->wlocked, 0);     
123 }                                                 
124                                                   
125 /**                                               
126  * queued_rwlock_is_contended - check if the l    
127  * @lock : Pointer to queued rwlock structure     
128  * Return: 1 if lock contended, 0 otherwise       
129  */                                               
130 static inline int queued_rwlock_is_contended(s    
131 {                                                 
132         return arch_spin_is_locked(&lock->wait    
133 }                                                 
134                                                   
135 /*                                                
136  * Remapping rwlock architecture specific func    
137  * queued rwlock functions.                       
138  */                                               
139 #define arch_read_lock(l)               queued    
140 #define arch_write_lock(l)              queued    
141 #define arch_read_trylock(l)            queued    
142 #define arch_write_trylock(l)           queued    
143 #define arch_read_unlock(l)             queued    
144 #define arch_write_unlock(l)            queued    
145 #define arch_rwlock_is_contended(l)     queued    
146                                                   
147 #endif /* __ASM_GENERIC_QRWLOCK_H */              
148                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php