hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/include/linux/spinlock.h
....@@ -97,21 +97,27 @@
9797 struct lock_class_key *key, short inner);
9898
9999 # define raw_spin_lock_init(lock) \
100
+ LOCK_ALTERNATIVES(lock, spin_lock_init, \
100101 do { \
101102 static struct lock_class_key __key; \
102103 \
103
- __raw_spin_lock_init((lock), #lock, &__key, LD_WAIT_SPIN); \
104
-} while (0)
104
+ __raw_spin_lock_init(__RAWLOCK(lock), #lock, &__key, LD_WAIT_SPIN); \
105
+} while (0))
105106
106107 #else
107108 # define raw_spin_lock_init(lock) \
108
- do { *(lock) = __RAW_SPIN_LOCK_UNLOCKED(lock); } while (0)
109
+ LOCK_ALTERNATIVES(lock, spin_lock_init, \
110
+ do { *(__RAWLOCK(lock)) = __RAW_SPIN_LOCK_UNLOCKED(__RAWLOCK(lock)); } while (0))
109111 #endif
110112
111
-#define raw_spin_is_locked(lock) arch_spin_is_locked(&(lock)->raw_lock)
113
+#define raw_spin_is_locked(lock) \
114
+ LOCK_ALTERNATIVES_RET(lock, spin_is_locked, \
115
+ arch_spin_is_locked(&(__RAWLOCK(lock))->raw_lock))
112116
113117 #ifdef arch_spin_is_contended
114
-#define raw_spin_is_contended(lock) arch_spin_is_contended(&(lock)->raw_lock)
118
+#define raw_spin_is_contended(lock) \
119
+ LOCK_ALTERNATIVES_RET(lock, spin_is_contended, \
120
+ arch_spin_is_contended(&(__RAWLOCK(lock))->raw_lock))
115121 #else
116122 #define raw_spin_is_contended(lock) (((void)(lock), 0))
117123 #endif /*arch_spin_is_contended*/
....@@ -220,13 +226,19 @@
220226 * various methods are defined as nops in the case they are not
221227 * required.
222228 */
223
-#define raw_spin_trylock(lock) __cond_lock(lock, _raw_spin_trylock(lock))
229
+#define raw_spin_trylock(lock) \
230
+ __cond_lock(lock, \
231
+ LOCK_ALTERNATIVES_RET(lock, \
232
+ spin_trylock, _raw_spin_trylock(__RAWLOCK(lock))))
224233
225
-#define raw_spin_lock(lock) _raw_spin_lock(lock)
234
+#define raw_spin_lock(lock) \
235
+ LOCK_ALTERNATIVES(lock, spin_lock, _raw_spin_lock(__RAWLOCK(lock)))
226236
227237 #ifdef CONFIG_DEBUG_LOCK_ALLOC
238
+
228239 # define raw_spin_lock_nested(lock, subclass) \
229
- _raw_spin_lock_nested(lock, subclass)
240
+ LOCK_ALTERNATIVES(lock, spin_lock_nested, \
241
+ _raw_spin_lock_nested(__RAWLOCK(lock), subclass), subclass)
230242
231243 # define raw_spin_lock_nest_lock(lock, nest_lock) \
232244 do { \
....@@ -239,18 +251,20 @@
239251 * warns about set-but-not-used variables when building with
240252 * CONFIG_DEBUG_LOCK_ALLOC=n and with W=1.
241253 */
242
-# define raw_spin_lock_nested(lock, subclass) \
243
- _raw_spin_lock(((void)(subclass), (lock)))
254
+# define raw_spin_lock_nested(lock, subclass) \
255
+ LOCK_ALTERNATIVES(lock, spin_lock_nested, \
256
+ _raw_spin_lock(((void)(subclass), __RAWLOCK(lock))), subclass)
244257 # define raw_spin_lock_nest_lock(lock, nest_lock) _raw_spin_lock(lock)
245258 #endif
246259
247260 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
248261
249
-#define raw_spin_lock_irqsave(lock, flags) \
250
- do { \
251
- typecheck(unsigned long, flags); \
252
- flags = _raw_spin_lock_irqsave(lock); \
253
- } while (0)
262
+#define raw_spin_lock_irqsave(lock, flags) \
263
+ LOCK_ALTERNATIVES(lock, spin_lock_irqsave, \
264
+ do { \
265
+ typecheck(unsigned long, flags); \
266
+ flags = _raw_spin_lock_irqsave(__RAWLOCK(lock)); \
267
+ } while (0), flags)
254268
255269 #ifdef CONFIG_DEBUG_LOCK_ALLOC
256270 #define raw_spin_lock_irqsave_nested(lock, flags, subclass) \
....@@ -268,45 +282,55 @@
268282
269283 #else
270284
271
-#define raw_spin_lock_irqsave(lock, flags) \
272
- do { \
273
- typecheck(unsigned long, flags); \
274
- _raw_spin_lock_irqsave(lock, flags); \
275
- } while (0)
285
+#define raw_spin_lock_irqsave(lock, flags) \
286
+ LOCK_ALTERNATIVES(lock, spin_lock_irqsave, \
287
+ do { \
288
+ typecheck(unsigned long, flags); \
289
+ _raw_spin_lock_irqsave(__RAWLOCK(lock), flags); \
290
+ } while (0), flags)
276291
277292 #define raw_spin_lock_irqsave_nested(lock, flags, subclass) \
278293 raw_spin_lock_irqsave(lock, flags)
279294
280295 #endif
281296
282
-#define raw_spin_lock_irq(lock) _raw_spin_lock_irq(lock)
297
+#define raw_spin_lock_irq(lock) \
298
+ LOCK_ALTERNATIVES(lock, spin_lock_irq, \
299
+ _raw_spin_lock_irq(__RAWLOCK(lock)))
283300 #define raw_spin_lock_bh(lock) _raw_spin_lock_bh(lock)
284
-#define raw_spin_unlock(lock) _raw_spin_unlock(lock)
285
-#define raw_spin_unlock_irq(lock) _raw_spin_unlock_irq(lock)
301
+#define raw_spin_unlock(lock) \
302
+ LOCK_ALTERNATIVES(lock, spin_unlock, \
303
+ _raw_spin_unlock(__RAWLOCK(lock)))
304
+#define raw_spin_unlock_irq(lock) \
305
+ LOCK_ALTERNATIVES(lock, spin_unlock_irq, \
306
+ _raw_spin_unlock_irq(__RAWLOCK(lock)))
286307
287
-#define raw_spin_unlock_irqrestore(lock, flags) \
288
- do { \
289
- typecheck(unsigned long, flags); \
290
- _raw_spin_unlock_irqrestore(lock, flags); \
291
- } while (0)
308
+#define raw_spin_unlock_irqrestore(lock, flags) \
309
+ LOCK_ALTERNATIVES(lock, spin_unlock_irqrestore, \
310
+ do { \
311
+ typecheck(unsigned long, flags); \
312
+ _raw_spin_unlock_irqrestore(__RAWLOCK(lock), flags); \
313
+ } while (0), flags)
292314 #define raw_spin_unlock_bh(lock) _raw_spin_unlock_bh(lock)
293315
294316 #define raw_spin_trylock_bh(lock) \
295317 __cond_lock(lock, _raw_spin_trylock_bh(lock))
296318
297319 #define raw_spin_trylock_irq(lock) \
320
+ LOCK_ALTERNATIVES_RET(lock, spin_trylock_irq, \
298321 ({ \
299322 local_irq_disable(); \
300
- raw_spin_trylock(lock) ? \
323
+ raw_spin_trylock(__RAWLOCK(lock)) ? \
301324 1 : ({ local_irq_enable(); 0; }); \
302
-})
325
+}))
303326
304327 #define raw_spin_trylock_irqsave(lock, flags) \
328
+ LOCK_ALTERNATIVES_RET(lock, spin_trylock_irqsave, \
305329 ({ \
306330 local_irq_save(flags); \
307
- raw_spin_trylock(lock) ? \
331
+ raw_spin_trylock(__RAWLOCK(lock)) ? \
308332 1 : ({ local_irq_restore(flags); 0; }); \
309
-})
333
+}), flags)
310334
311335 /* Include rwlock functions */
312336 #include <linux/rwlock.h>
....@@ -320,12 +344,20 @@
320344 # include <linux/spinlock_api_up.h>
321345 #endif
322346
347
+/* Pull the lock types specific to the IRQ pipeline. */
348
+#ifdef CONFIG_IRQ_PIPELINE
349
+#include <linux/spinlock_pipeline.h>
350
+#else
351
+static inline void check_spinlock_context(void) { }
352
+#endif
353
+
323354 /*
324355 * Map the spin_lock functions to the raw variants for PREEMPT_RT=n
325356 */
326357
327358 static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
328359 {
360
+ check_spinlock_context();
329361 return &lock->rlock;
330362 }
331363