Changes in kernel/generic/include/synch/spinlock.h [90c8b8d:7e752b2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/synch/spinlock.h
r90c8b8d r7e752b2 36 36 #define KERN_SPINLOCK_H_ 37 37 38 #include < arch/types.h>38 #include <typedefs.h> 39 39 #include <arch/barrier.h> 40 40 #include <preemption.h> 41 41 #include <atomic.h> 42 42 #include <debug.h> 43 #include <arch/asm.h> 43 44 44 45 #ifdef CONFIG_SMP … … 48 49 49 50 #ifdef CONFIG_DEBUG_SPINLOCK 50 c har *name;51 #endif 51 const char *name; 52 #endif /* CONFIG_DEBUG_SPINLOCK */ 52 53 } spinlock_t; 53 54 … … 60 61 61 62 /* 62 * SPINLOCK_INITIALIZE is to be used for statically allocated spinlocks. 63 * It declares and initializes the lock. 63 * SPINLOCK_INITIALIZE and SPINLOCK_STATIC_INITIALIZE are to be used 64 * for statically allocated spinlocks. They declare (either as global 65 * or static) symbol and initialize the lock. 64 66 */ 65 67 #ifdef CONFIG_DEBUG_SPINLOCK … … 77 79 } 78 80 79 #define spinlock_lock(lock) spinlock_lock_debug(lock) 80 81 #else 81 #define ASSERT_SPINLOCK(expr, lock) \ 82 ASSERT_VERBOSE(expr, (lock)->name) 83 84 #define spinlock_lock(lock) spinlock_lock_debug((lock)) 85 #define spinlock_unlock(lock) spinlock_unlock_debug((lock)) 86 87 #else /* CONFIG_DEBUG_SPINLOCK */ 82 88 83 89 #define SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \ … … 91 97 } 92 98 93 #define spinlock_lock(lock) atomic_lock_arch(&(lock)->val) 94 95 #endif 99 #define ASSERT_SPINLOCK(expr, lock) \ 100 ASSERT(expr) 101 102 #define spinlock_lock(lock) atomic_lock_arch(&(lock)->val) 103 #define spinlock_unlock(lock) spinlock_unlock_nondebug((lock)) 104 105 #endif /* CONFIG_DEBUG_SPINLOCK */ 96 106 97 107 #define SPINLOCK_INITIALIZE(lock_name) \ … … 101 111 SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, #lock_name) 102 112 103 extern void spinlock_initialize(spinlock_t *lock, char *name); 104 extern int spinlock_trylock(spinlock_t *lock); 105 extern void spinlock_lock_debug(spinlock_t *lock); 113 extern void spinlock_initialize(spinlock_t *, const char *); 114 extern int spinlock_trylock(spinlock_t *); 115 extern void spinlock_lock_debug(spinlock_t *); 116 extern void spinlock_unlock_debug(spinlock_t *); 117 extern bool spinlock_locked(spinlock_t *); 106 118 107 119 /** Unlock spinlock 108 120 * 109 * Unlock spinlock .121 * Unlock spinlock for non-debug kernels. 110 122 * 111 123 * @param sl Pointer to spinlock_t structure. 112 */ 113 static inline void spinlock_unlock(spinlock_t *lock) 124 * 125 */ 126 NO_TRACE static inline void spinlock_unlock_nondebug(spinlock_t *lock) 114 127 { 115 ASSERT(atomic_get(&lock->val) != 0);116 117 128 /* 118 129 * Prevent critical section code from bleeding out this way down. … … 135 146 if ((pname)++ > (value)) { \ 136 147 (pname) = 0; \ 137 printf("Deadlock probe %s: exceeded threshold %u\n" ,\148 printf("Deadlock probe %s: exceeded threshold %u\n" \ 138 149 "cpu%u: function=%s, line=%u\n", \ 139 150 #pname, (value), CPU->id, __func__, __LINE__); \ 140 151 } 141 152 142 #else 153 #else /* CONFIG_DEBUG_SPINLOCK */ 143 154 144 155 #define DEADLOCK_PROBE_INIT(pname) 145 156 #define DEADLOCK_PROBE(pname, value) 146 157 147 #endif 158 #endif /* CONFIG_DEBUG_SPINLOCK */ 148 159 149 160 #else /* CONFIG_SMP */ … … 159 170 #define SPINLOCK_INITIALIZE_NAME(name, desc_name) 160 171 #define SPINLOCK_STATIC_INITIALIZE_NAME(name, desc_name) 172 173 #define ASSERT_SPINLOCK(expr, lock) ASSERT(expr) 161 174 162 175 #define spinlock_initialize(lock, name) … … 165 178 #define spinlock_trylock(lock) (preemption_disable(), 1) 166 179 #define spinlock_unlock(lock) preemption_enable() 180 #define spinlock_locked(lock) 1 181 #define spinlock_unlocked(lock) 1 167 182 168 183 #define DEADLOCK_PROBE_INIT(pname) 169 184 #define DEADLOCK_PROBE(pname, value) 170 185 186 #endif /* CONFIG_SMP */ 187 188 typedef struct { 189 SPINLOCK_DECLARE(lock); /**< Spinlock */ 190 bool guard; /**< Flag whether ipl is valid */ 191 ipl_t ipl; /**< Original interrupt level */ 192 } irq_spinlock_t; 193 194 #define IRQ_SPINLOCK_DECLARE(lock_name) irq_spinlock_t lock_name 195 #define IRQ_SPINLOCK_EXTERN(lock_name) extern irq_spinlock_t lock_name 196 197 #ifdef CONFIG_SMP 198 199 #define ASSERT_IRQ_SPINLOCK(expr, irq_lock) \ 200 ASSERT_SPINLOCK(expr, &((irq_lock)->lock)) 201 202 /* 203 * IRQ_SPINLOCK_INITIALIZE and IRQ_SPINLOCK_STATIC_INITIALIZE are to be used 204 * for statically allocated interrupts-disabled spinlocks. They declare (either 205 * as global or static symbol) and initialize the lock. 206 */ 207 #ifdef CONFIG_DEBUG_SPINLOCK 208 209 #define IRQ_SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \ 210 irq_spinlock_t lock_name = { \ 211 .lock = { \ 212 .name = desc_name, \ 213 .val = { 0 } \ 214 }, \ 215 .guard = false, \ 216 .ipl = 0 \ 217 } 218 219 #define IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, desc_name) \ 220 static irq_spinlock_t lock_name = { \ 221 .lock = { \ 222 .name = desc_name, \ 223 .val = { 0 } \ 224 }, \ 225 .guard = false, \ 226 .ipl = 0 \ 227 } 228 229 #else /* CONFIG_DEBUG_SPINLOCK */ 230 231 #define IRQ_SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \ 232 irq_spinlock_t lock_name = { \ 233 .lock = { \ 234 .val = { 0 } \ 235 }, \ 236 .guard = false, \ 237 .ipl = 0 \ 238 } 239 240 #define IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, desc_name) \ 241 static irq_spinlock_t lock_name = { \ 242 .lock = { \ 243 .val = { 0 } \ 244 }, \ 245 .guard = false, \ 246 .ipl = 0 \ 247 } 248 249 #endif /* CONFIG_DEBUG_SPINLOCK */ 250 251 #else /* CONFIG_SMP */ 252 253 /* 254 * Since the spinlocks are void on UP systems, we also need 255 * to have a special variant of interrupts-disabled spinlock 256 * macros which take this into account. 257 */ 258 259 #define ASSERT_IRQ_SPINLOCK(expr, irq_lock) \ 260 ASSERT_SPINLOCK(expr, NULL) 261 262 #define IRQ_SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \ 263 irq_spinlock_t lock_name = { \ 264 .guard = false, \ 265 .ipl = 0 \ 266 } 267 268 #define IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, desc_name) \ 269 static irq_spinlock_t lock_name = { \ 270 .guard = false, \ 271 .ipl = 0 \ 272 } 273 274 #endif /* CONFIG_SMP */ 275 276 #define IRQ_SPINLOCK_INITIALIZE(lock_name) \ 277 IRQ_SPINLOCK_INITIALIZE_NAME(lock_name, #lock_name) 278 279 #define IRQ_SPINLOCK_STATIC_INITIALIZE(lock_name) \ 280 IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, #lock_name) 281 282 extern void irq_spinlock_initialize(irq_spinlock_t *, const char *); 283 extern void irq_spinlock_lock(irq_spinlock_t *, bool); 284 extern void irq_spinlock_unlock(irq_spinlock_t *, bool); 285 extern int irq_spinlock_trylock(irq_spinlock_t *); 286 extern void irq_spinlock_pass(irq_spinlock_t *, irq_spinlock_t *); 287 extern void irq_spinlock_exchange(irq_spinlock_t *, irq_spinlock_t *); 288 extern bool irq_spinlock_locked(irq_spinlock_t *); 289 171 290 #endif 172 291 173 #endif174 175 292 /** @} 176 293 */
Note:
See TracChangeset
for help on using the changeset viewer.