xref: /openbmc/linux/lib/locking-selftest.c (revision edfd52e6)
1 /*
2  * lib/locking-selftest.c
3  *
4  * Testsuite for various locking APIs: spinlocks, rwlocks,
5  * mutexes and rw-semaphores.
6  *
7  * It is checking both false positives and false negatives.
8  *
9  * Started by Ingo Molnar:
10  *
11  *  Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
12  */
13 #include <linux/rwsem.h>
14 #include <linux/mutex.h>
15 #include <linux/sched.h>
16 #include <linux/delay.h>
17 #include <linux/module.h>
18 #include <linux/lockdep.h>
19 #include <linux/spinlock.h>
20 #include <linux/kallsyms.h>
21 #include <linux/interrupt.h>
22 #include <linux/debug_locks.h>
23 #include <linux/irqflags.h>
24 
25 /*
26  * Change this to 1 if you want to see the failure printouts:
27  */
28 static unsigned int debug_locks_verbose;
29 
30 static int __init setup_debug_locks_verbose(char *str)
31 {
32 	get_option(&str, &debug_locks_verbose);
33 
34 	return 1;
35 }
36 
37 __setup("debug_locks_verbose=", setup_debug_locks_verbose);
38 
39 #define FAILURE		0
40 #define SUCCESS		1
41 
42 #define LOCKTYPE_SPIN	0x1
43 #define LOCKTYPE_RWLOCK	0x2
44 #define LOCKTYPE_MUTEX	0x4
45 #define LOCKTYPE_RWSEM	0x8
46 
47 /*
48  * Normal standalone locks, for the circular and irq-context
49  * dependency tests:
50  */
51 static DEFINE_SPINLOCK(lock_A);
52 static DEFINE_SPINLOCK(lock_B);
53 static DEFINE_SPINLOCK(lock_C);
54 static DEFINE_SPINLOCK(lock_D);
55 
56 static DEFINE_RWLOCK(rwlock_A);
57 static DEFINE_RWLOCK(rwlock_B);
58 static DEFINE_RWLOCK(rwlock_C);
59 static DEFINE_RWLOCK(rwlock_D);
60 
61 static DEFINE_MUTEX(mutex_A);
62 static DEFINE_MUTEX(mutex_B);
63 static DEFINE_MUTEX(mutex_C);
64 static DEFINE_MUTEX(mutex_D);
65 
66 static DECLARE_RWSEM(rwsem_A);
67 static DECLARE_RWSEM(rwsem_B);
68 static DECLARE_RWSEM(rwsem_C);
69 static DECLARE_RWSEM(rwsem_D);
70 
71 /*
72  * Locks that we initialize dynamically as well so that
73  * e.g. X1 and X2 becomes two instances of the same class,
74  * but X* and Y* are different classes. We do this so that
75  * we do not trigger a real lockup:
76  */
77 static DEFINE_SPINLOCK(lock_X1);
78 static DEFINE_SPINLOCK(lock_X2);
79 static DEFINE_SPINLOCK(lock_Y1);
80 static DEFINE_SPINLOCK(lock_Y2);
81 static DEFINE_SPINLOCK(lock_Z1);
82 static DEFINE_SPINLOCK(lock_Z2);
83 
84 static DEFINE_RWLOCK(rwlock_X1);
85 static DEFINE_RWLOCK(rwlock_X2);
86 static DEFINE_RWLOCK(rwlock_Y1);
87 static DEFINE_RWLOCK(rwlock_Y2);
88 static DEFINE_RWLOCK(rwlock_Z1);
89 static DEFINE_RWLOCK(rwlock_Z2);
90 
91 static DEFINE_MUTEX(mutex_X1);
92 static DEFINE_MUTEX(mutex_X2);
93 static DEFINE_MUTEX(mutex_Y1);
94 static DEFINE_MUTEX(mutex_Y2);
95 static DEFINE_MUTEX(mutex_Z1);
96 static DEFINE_MUTEX(mutex_Z2);
97 
98 static DECLARE_RWSEM(rwsem_X1);
99 static DECLARE_RWSEM(rwsem_X2);
100 static DECLARE_RWSEM(rwsem_Y1);
101 static DECLARE_RWSEM(rwsem_Y2);
102 static DECLARE_RWSEM(rwsem_Z1);
103 static DECLARE_RWSEM(rwsem_Z2);
104 
105 /*
106  * non-inlined runtime initializers, to let separate locks share
107  * the same lock-class:
108  */
109 #define INIT_CLASS_FUNC(class) 				\
110 static noinline void					\
111 init_class_##class(spinlock_t *lock, rwlock_t *rwlock, struct mutex *mutex, \
112 		 struct rw_semaphore *rwsem)		\
113 {							\
114 	spin_lock_init(lock);				\
115 	rwlock_init(rwlock);				\
116 	mutex_init(mutex);				\
117 	init_rwsem(rwsem);				\
118 }
119 
120 INIT_CLASS_FUNC(X)
121 INIT_CLASS_FUNC(Y)
122 INIT_CLASS_FUNC(Z)
123 
124 static void init_shared_classes(void)
125 {
126 	init_class_X(&lock_X1, &rwlock_X1, &mutex_X1, &rwsem_X1);
127 	init_class_X(&lock_X2, &rwlock_X2, &mutex_X2, &rwsem_X2);
128 
129 	init_class_Y(&lock_Y1, &rwlock_Y1, &mutex_Y1, &rwsem_Y1);
130 	init_class_Y(&lock_Y2, &rwlock_Y2, &mutex_Y2, &rwsem_Y2);
131 
132 	init_class_Z(&lock_Z1, &rwlock_Z1, &mutex_Z1, &rwsem_Z1);
133 	init_class_Z(&lock_Z2, &rwlock_Z2, &mutex_Z2, &rwsem_Z2);
134 }
135 
136 /*
137  * For spinlocks and rwlocks we also do hardirq-safe / softirq-safe tests.
138  * The following functions use a lock from a simulated hardirq/softirq
139  * context, causing the locks to be marked as hardirq-safe/softirq-safe:
140  */
141 
142 #define HARDIRQ_DISABLE		local_irq_disable
143 #define HARDIRQ_ENABLE		local_irq_enable
144 
145 #define HARDIRQ_ENTER()				\
146 	local_irq_disable();			\
147 	__irq_enter();				\
148 	WARN_ON(!in_irq());
149 
150 #define HARDIRQ_EXIT()				\
151 	__irq_exit();				\
152 	local_irq_enable();
153 
154 #define SOFTIRQ_DISABLE		local_bh_disable
155 #define SOFTIRQ_ENABLE		local_bh_enable
156 
157 #define SOFTIRQ_ENTER()				\
158 		local_bh_disable();		\
159 		local_irq_disable();		\
160 		lockdep_softirq_enter();	\
161 		WARN_ON(!in_softirq());
162 
163 #define SOFTIRQ_EXIT()				\
164 		lockdep_softirq_exit();		\
165 		local_irq_enable();		\
166 		local_bh_enable();
167 
168 /*
169  * Shortcuts for lock/unlock API variants, to keep
170  * the testcases compact:
171  */
172 #define L(x)			spin_lock(&lock_##x)
173 #define U(x)			spin_unlock(&lock_##x)
174 #define LU(x)			L(x); U(x)
175 #define SI(x)			spin_lock_init(&lock_##x)
176 
177 #define WL(x)			write_lock(&rwlock_##x)
178 #define WU(x)			write_unlock(&rwlock_##x)
179 #define WLU(x)			WL(x); WU(x)
180 
181 #define RL(x)			read_lock(&rwlock_##x)
182 #define RU(x)			read_unlock(&rwlock_##x)
183 #define RLU(x)			RL(x); RU(x)
184 #define RWI(x)			rwlock_init(&rwlock_##x)
185 
186 #define ML(x)			mutex_lock(&mutex_##x)
187 #define MU(x)			mutex_unlock(&mutex_##x)
188 #define MI(x)			mutex_init(&mutex_##x)
189 
190 #define WSL(x)			down_write(&rwsem_##x)
191 #define WSU(x)			up_write(&rwsem_##x)
192 
193 #define RSL(x)			down_read(&rwsem_##x)
194 #define RSU(x)			up_read(&rwsem_##x)
195 #define RWSI(x)			init_rwsem(&rwsem_##x)
196 
197 #define LOCK_UNLOCK_2(x,y)	LOCK(x); LOCK(y); UNLOCK(y); UNLOCK(x)
198 
199 /*
200  * Generate different permutations of the same testcase, using
201  * the same basic lock-dependency/state events:
202  */
203 
204 #define GENERATE_TESTCASE(name)			\
205 						\
206 static void name(void) { E(); }
207 
208 #define GENERATE_PERMUTATIONS_2_EVENTS(name)	\
209 						\
210 static void name##_12(void) { E1(); E2(); }	\
211 static void name##_21(void) { E2(); E1(); }
212 
213 #define GENERATE_PERMUTATIONS_3_EVENTS(name)		\
214 							\
215 static void name##_123(void) { E1(); E2(); E3(); }	\
216 static void name##_132(void) { E1(); E3(); E2(); }	\
217 static void name##_213(void) { E2(); E1(); E3(); }	\
218 static void name##_231(void) { E2(); E3(); E1(); }	\
219 static void name##_312(void) { E3(); E1(); E2(); }	\
220 static void name##_321(void) { E3(); E2(); E1(); }
221 
222 /*
223  * AA deadlock:
224  */
225 
226 #define E()					\
227 						\
228 	LOCK(X1);				\
229 	LOCK(X2); /* this one should fail */
230 
231 /*
232  * 6 testcases:
233  */
234 #include "locking-selftest-spin.h"
235 GENERATE_TESTCASE(AA_spin)
236 #include "locking-selftest-wlock.h"
237 GENERATE_TESTCASE(AA_wlock)
238 #include "locking-selftest-rlock.h"
239 GENERATE_TESTCASE(AA_rlock)
240 #include "locking-selftest-mutex.h"
241 GENERATE_TESTCASE(AA_mutex)
242 #include "locking-selftest-wsem.h"
243 GENERATE_TESTCASE(AA_wsem)
244 #include "locking-selftest-rsem.h"
245 GENERATE_TESTCASE(AA_rsem)
246 
247 #undef E
248 
249 /*
250  * Special-case for read-locking, they are
251  * allowed to recurse on the same lock class:
252  */
253 static void rlock_AA1(void)
254 {
255 	RL(X1);
256 	RL(X1); // this one should NOT fail
257 }
258 
259 static void rlock_AA1B(void)
260 {
261 	RL(X1);
262 	RL(X2); // this one should NOT fail
263 }
264 
265 static void rsem_AA1(void)
266 {
267 	RSL(X1);
268 	RSL(X1); // this one should fail
269 }
270 
271 static void rsem_AA1B(void)
272 {
273 	RSL(X1);
274 	RSL(X2); // this one should fail
275 }
276 /*
277  * The mixing of read and write locks is not allowed:
278  */
279 static void rlock_AA2(void)
280 {
281 	RL(X1);
282 	WL(X2); // this one should fail
283 }
284 
285 static void rsem_AA2(void)
286 {
287 	RSL(X1);
288 	WSL(X2); // this one should fail
289 }
290 
291 static void rlock_AA3(void)
292 {
293 	WL(X1);
294 	RL(X2); // this one should fail
295 }
296 
297 static void rsem_AA3(void)
298 {
299 	WSL(X1);
300 	RSL(X2); // this one should fail
301 }
302 
303 /*
304  * ABBA deadlock:
305  */
306 
307 #define E()					\
308 						\
309 	LOCK_UNLOCK_2(A, B);			\
310 	LOCK_UNLOCK_2(B, A); /* fail */
311 
312 /*
313  * 6 testcases:
314  */
315 #include "locking-selftest-spin.h"
316 GENERATE_TESTCASE(ABBA_spin)
317 #include "locking-selftest-wlock.h"
318 GENERATE_TESTCASE(ABBA_wlock)
319 #include "locking-selftest-rlock.h"
320 GENERATE_TESTCASE(ABBA_rlock)
321 #include "locking-selftest-mutex.h"
322 GENERATE_TESTCASE(ABBA_mutex)
323 #include "locking-selftest-wsem.h"
324 GENERATE_TESTCASE(ABBA_wsem)
325 #include "locking-selftest-rsem.h"
326 GENERATE_TESTCASE(ABBA_rsem)
327 
328 #undef E
329 
330 /*
331  * AB BC CA deadlock:
332  */
333 
334 #define E()					\
335 						\
336 	LOCK_UNLOCK_2(A, B);			\
337 	LOCK_UNLOCK_2(B, C);			\
338 	LOCK_UNLOCK_2(C, A); /* fail */
339 
340 /*
341  * 6 testcases:
342  */
343 #include "locking-selftest-spin.h"
344 GENERATE_TESTCASE(ABBCCA_spin)
345 #include "locking-selftest-wlock.h"
346 GENERATE_TESTCASE(ABBCCA_wlock)
347 #include "locking-selftest-rlock.h"
348 GENERATE_TESTCASE(ABBCCA_rlock)
349 #include "locking-selftest-mutex.h"
350 GENERATE_TESTCASE(ABBCCA_mutex)
351 #include "locking-selftest-wsem.h"
352 GENERATE_TESTCASE(ABBCCA_wsem)
353 #include "locking-selftest-rsem.h"
354 GENERATE_TESTCASE(ABBCCA_rsem)
355 
356 #undef E
357 
358 /*
359  * AB CA BC deadlock:
360  */
361 
362 #define E()					\
363 						\
364 	LOCK_UNLOCK_2(A, B);			\
365 	LOCK_UNLOCK_2(C, A);			\
366 	LOCK_UNLOCK_2(B, C); /* fail */
367 
368 /*
369  * 6 testcases:
370  */
371 #include "locking-selftest-spin.h"
372 GENERATE_TESTCASE(ABCABC_spin)
373 #include "locking-selftest-wlock.h"
374 GENERATE_TESTCASE(ABCABC_wlock)
375 #include "locking-selftest-rlock.h"
376 GENERATE_TESTCASE(ABCABC_rlock)
377 #include "locking-selftest-mutex.h"
378 GENERATE_TESTCASE(ABCABC_mutex)
379 #include "locking-selftest-wsem.h"
380 GENERATE_TESTCASE(ABCABC_wsem)
381 #include "locking-selftest-rsem.h"
382 GENERATE_TESTCASE(ABCABC_rsem)
383 
384 #undef E
385 
386 /*
387  * AB BC CD DA deadlock:
388  */
389 
390 #define E()					\
391 						\
392 	LOCK_UNLOCK_2(A, B);			\
393 	LOCK_UNLOCK_2(B, C);			\
394 	LOCK_UNLOCK_2(C, D);			\
395 	LOCK_UNLOCK_2(D, A); /* fail */
396 
397 /*
398  * 6 testcases:
399  */
400 #include "locking-selftest-spin.h"
401 GENERATE_TESTCASE(ABBCCDDA_spin)
402 #include "locking-selftest-wlock.h"
403 GENERATE_TESTCASE(ABBCCDDA_wlock)
404 #include "locking-selftest-rlock.h"
405 GENERATE_TESTCASE(ABBCCDDA_rlock)
406 #include "locking-selftest-mutex.h"
407 GENERATE_TESTCASE(ABBCCDDA_mutex)
408 #include "locking-selftest-wsem.h"
409 GENERATE_TESTCASE(ABBCCDDA_wsem)
410 #include "locking-selftest-rsem.h"
411 GENERATE_TESTCASE(ABBCCDDA_rsem)
412 
413 #undef E
414 
415 /*
416  * AB CD BD DA deadlock:
417  */
418 #define E()					\
419 						\
420 	LOCK_UNLOCK_2(A, B);			\
421 	LOCK_UNLOCK_2(C, D);			\
422 	LOCK_UNLOCK_2(B, D);			\
423 	LOCK_UNLOCK_2(D, A); /* fail */
424 
425 /*
426  * 6 testcases:
427  */
428 #include "locking-selftest-spin.h"
429 GENERATE_TESTCASE(ABCDBDDA_spin)
430 #include "locking-selftest-wlock.h"
431 GENERATE_TESTCASE(ABCDBDDA_wlock)
432 #include "locking-selftest-rlock.h"
433 GENERATE_TESTCASE(ABCDBDDA_rlock)
434 #include "locking-selftest-mutex.h"
435 GENERATE_TESTCASE(ABCDBDDA_mutex)
436 #include "locking-selftest-wsem.h"
437 GENERATE_TESTCASE(ABCDBDDA_wsem)
438 #include "locking-selftest-rsem.h"
439 GENERATE_TESTCASE(ABCDBDDA_rsem)
440 
441 #undef E
442 
443 /*
444  * AB CD BC DA deadlock:
445  */
446 #define E()					\
447 						\
448 	LOCK_UNLOCK_2(A, B);			\
449 	LOCK_UNLOCK_2(C, D);			\
450 	LOCK_UNLOCK_2(B, C);			\
451 	LOCK_UNLOCK_2(D, A); /* fail */
452 
453 /*
454  * 6 testcases:
455  */
456 #include "locking-selftest-spin.h"
457 GENERATE_TESTCASE(ABCDBCDA_spin)
458 #include "locking-selftest-wlock.h"
459 GENERATE_TESTCASE(ABCDBCDA_wlock)
460 #include "locking-selftest-rlock.h"
461 GENERATE_TESTCASE(ABCDBCDA_rlock)
462 #include "locking-selftest-mutex.h"
463 GENERATE_TESTCASE(ABCDBCDA_mutex)
464 #include "locking-selftest-wsem.h"
465 GENERATE_TESTCASE(ABCDBCDA_wsem)
466 #include "locking-selftest-rsem.h"
467 GENERATE_TESTCASE(ABCDBCDA_rsem)
468 
469 #undef E
470 
471 /*
472  * Double unlock:
473  */
474 #define E()					\
475 						\
476 	LOCK(A);				\
477 	UNLOCK(A);				\
478 	UNLOCK(A); /* fail */
479 
480 /*
481  * 6 testcases:
482  */
483 #include "locking-selftest-spin.h"
484 GENERATE_TESTCASE(double_unlock_spin)
485 #include "locking-selftest-wlock.h"
486 GENERATE_TESTCASE(double_unlock_wlock)
487 #include "locking-selftest-rlock.h"
488 GENERATE_TESTCASE(double_unlock_rlock)
489 #include "locking-selftest-mutex.h"
490 GENERATE_TESTCASE(double_unlock_mutex)
491 #include "locking-selftest-wsem.h"
492 GENERATE_TESTCASE(double_unlock_wsem)
493 #include "locking-selftest-rsem.h"
494 GENERATE_TESTCASE(double_unlock_rsem)
495 
496 #undef E
497 
498 /*
499  * Bad unlock ordering:
500  */
501 #define E()					\
502 						\
503 	LOCK(A);				\
504 	LOCK(B);				\
505 	UNLOCK(A); /* fail */			\
506 	UNLOCK(B);
507 
508 /*
509  * 6 testcases:
510  */
511 #include "locking-selftest-spin.h"
512 GENERATE_TESTCASE(bad_unlock_order_spin)
513 #include "locking-selftest-wlock.h"
514 GENERATE_TESTCASE(bad_unlock_order_wlock)
515 #include "locking-selftest-rlock.h"
516 GENERATE_TESTCASE(bad_unlock_order_rlock)
517 #include "locking-selftest-mutex.h"
518 GENERATE_TESTCASE(bad_unlock_order_mutex)
519 #include "locking-selftest-wsem.h"
520 GENERATE_TESTCASE(bad_unlock_order_wsem)
521 #include "locking-selftest-rsem.h"
522 GENERATE_TESTCASE(bad_unlock_order_rsem)
523 
524 #undef E
525 
526 /*
527  * initializing a held lock:
528  */
529 #define E()					\
530 						\
531 	LOCK(A);				\
532 	INIT(A); /* fail */
533 
534 /*
535  * 6 testcases:
536  */
537 #include "locking-selftest-spin.h"
538 GENERATE_TESTCASE(init_held_spin)
539 #include "locking-selftest-wlock.h"
540 GENERATE_TESTCASE(init_held_wlock)
541 #include "locking-selftest-rlock.h"
542 GENERATE_TESTCASE(init_held_rlock)
543 #include "locking-selftest-mutex.h"
544 GENERATE_TESTCASE(init_held_mutex)
545 #include "locking-selftest-wsem.h"
546 GENERATE_TESTCASE(init_held_wsem)
547 #include "locking-selftest-rsem.h"
548 GENERATE_TESTCASE(init_held_rsem)
549 
550 #undef E
551 
552 /*
553  * locking an irq-safe lock with irqs enabled:
554  */
555 #define E1()				\
556 					\
557 	IRQ_ENTER();			\
558 	LOCK(A);			\
559 	UNLOCK(A);			\
560 	IRQ_EXIT();
561 
562 #define E2()				\
563 					\
564 	LOCK(A);			\
565 	UNLOCK(A);
566 
567 /*
568  * Generate 24 testcases:
569  */
570 #include "locking-selftest-spin-hardirq.h"
571 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin)
572 
573 #include "locking-selftest-rlock-hardirq.h"
574 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_rlock)
575 
576 #include "locking-selftest-wlock-hardirq.h"
577 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_wlock)
578 
579 #include "locking-selftest-spin-softirq.h"
580 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_spin)
581 
582 #include "locking-selftest-rlock-softirq.h"
583 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_rlock)
584 
585 #include "locking-selftest-wlock-softirq.h"
586 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_wlock)
587 
588 #undef E1
589 #undef E2
590 
591 /*
592  * Enabling hardirqs with a softirq-safe lock held:
593  */
594 #define E1()				\
595 					\
596 	SOFTIRQ_ENTER();		\
597 	LOCK(A);			\
598 	UNLOCK(A);			\
599 	SOFTIRQ_EXIT();
600 
601 #define E2()				\
602 					\
603 	HARDIRQ_DISABLE();		\
604 	LOCK(A);			\
605 	HARDIRQ_ENABLE();		\
606 	UNLOCK(A);
607 
608 /*
609  * Generate 12 testcases:
610  */
611 #include "locking-selftest-spin.h"
612 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_spin)
613 
614 #include "locking-selftest-wlock.h"
615 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_wlock)
616 
617 #include "locking-selftest-rlock.h"
618 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_rlock)
619 
620 #undef E1
621 #undef E2
622 
623 /*
624  * Enabling irqs with an irq-safe lock held:
625  */
626 #define E1()				\
627 					\
628 	IRQ_ENTER();			\
629 	LOCK(A);			\
630 	UNLOCK(A);			\
631 	IRQ_EXIT();
632 
633 #define E2()				\
634 					\
635 	IRQ_DISABLE();			\
636 	LOCK(A);			\
637 	IRQ_ENABLE();			\
638 	UNLOCK(A);
639 
640 /*
641  * Generate 24 testcases:
642  */
643 #include "locking-selftest-spin-hardirq.h"
644 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_spin)
645 
646 #include "locking-selftest-rlock-hardirq.h"
647 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_rlock)
648 
649 #include "locking-selftest-wlock-hardirq.h"
650 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_wlock)
651 
652 #include "locking-selftest-spin-softirq.h"
653 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_spin)
654 
655 #include "locking-selftest-rlock-softirq.h"
656 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_rlock)
657 
658 #include "locking-selftest-wlock-softirq.h"
659 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock)
660 
661 #undef E1
662 #undef E2
663 
664 /*
665  * Acquiring a irq-unsafe lock while holding an irq-safe-lock:
666  */
667 #define E1()				\
668 					\
669 	LOCK(A);			\
670 	LOCK(B);			\
671 	UNLOCK(B);			\
672 	UNLOCK(A);			\
673 
674 #define E2()				\
675 					\
676 	LOCK(B);			\
677 	UNLOCK(B);
678 
679 #define E3()				\
680 					\
681 	IRQ_ENTER();			\
682 	LOCK(A);			\
683 	UNLOCK(A);			\
684 	IRQ_EXIT();
685 
686 /*
687  * Generate 36 testcases:
688  */
689 #include "locking-selftest-spin-hardirq.h"
690 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_spin)
691 
692 #include "locking-selftest-rlock-hardirq.h"
693 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_rlock)
694 
695 #include "locking-selftest-wlock-hardirq.h"
696 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_wlock)
697 
698 #include "locking-selftest-spin-softirq.h"
699 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_spin)
700 
701 #include "locking-selftest-rlock-softirq.h"
702 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_rlock)
703 
704 #include "locking-selftest-wlock-softirq.h"
705 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock)
706 
707 #undef E1
708 #undef E2
709 #undef E3
710 
711 /*
712  * If a lock turns into softirq-safe, but earlier it took
713  * a softirq-unsafe lock:
714  */
715 
716 #define E1()				\
717 	IRQ_DISABLE();			\
718 	LOCK(A);			\
719 	LOCK(B);			\
720 	UNLOCK(B);			\
721 	UNLOCK(A);			\
722 	IRQ_ENABLE();
723 
724 #define E2()				\
725 	LOCK(B);			\
726 	UNLOCK(B);
727 
728 #define E3()				\
729 	IRQ_ENTER();			\
730 	LOCK(A);			\
731 	UNLOCK(A);			\
732 	IRQ_EXIT();
733 
734 /*
735  * Generate 36 testcases:
736  */
737 #include "locking-selftest-spin-hardirq.h"
738 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_spin)
739 
740 #include "locking-selftest-rlock-hardirq.h"
741 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_rlock)
742 
743 #include "locking-selftest-wlock-hardirq.h"
744 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_wlock)
745 
746 #include "locking-selftest-spin-softirq.h"
747 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_spin)
748 
749 #include "locking-selftest-rlock-softirq.h"
750 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_rlock)
751 
752 #include "locking-selftest-wlock-softirq.h"
753 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_wlock)
754 
755 #undef E1
756 #undef E2
757 #undef E3
758 
759 /*
760  * read-lock / write-lock irq inversion.
761  *
762  * Deadlock scenario:
763  *
764  * CPU#1 is at #1, i.e. it has write-locked A, but has not
765  * taken B yet.
766  *
767  * CPU#2 is at #2, i.e. it has locked B.
768  *
769  * Hardirq hits CPU#2 at point #2 and is trying to read-lock A.
770  *
771  * The deadlock occurs because CPU#1 will spin on B, and CPU#2
772  * will spin on A.
773  */
774 
775 #define E1()				\
776 					\
777 	IRQ_DISABLE();			\
778 	WL(A);				\
779 	LOCK(B);			\
780 	UNLOCK(B);			\
781 	WU(A);				\
782 	IRQ_ENABLE();
783 
784 #define E2()				\
785 					\
786 	LOCK(B);			\
787 	UNLOCK(B);
788 
789 #define E3()				\
790 					\
791 	IRQ_ENTER();			\
792 	RL(A);				\
793 	RU(A);				\
794 	IRQ_EXIT();
795 
796 /*
797  * Generate 36 testcases:
798  */
799 #include "locking-selftest-spin-hardirq.h"
800 GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_hard_spin)
801 
802 #include "locking-selftest-rlock-hardirq.h"
803 GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_hard_rlock)
804 
805 #include "locking-selftest-wlock-hardirq.h"
806 GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_hard_wlock)
807 
808 #include "locking-selftest-spin-softirq.h"
809 GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_spin)
810 
811 #include "locking-selftest-rlock-softirq.h"
812 GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_rlock)
813 
814 #include "locking-selftest-wlock-softirq.h"
815 GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_wlock)
816 
817 #undef E1
818 #undef E2
819 #undef E3
820 
821 /*
822  * read-lock / write-lock recursion that is actually safe.
823  */
824 
825 #define E1()				\
826 					\
827 	IRQ_DISABLE();			\
828 	WL(A);				\
829 	WU(A);				\
830 	IRQ_ENABLE();
831 
832 #define E2()				\
833 					\
834 	RL(A);				\
835 	RU(A);				\
836 
837 #define E3()				\
838 					\
839 	IRQ_ENTER();			\
840 	RL(A);				\
841 	L(B);				\
842 	U(B);				\
843 	RU(A);				\
844 	IRQ_EXIT();
845 
846 /*
847  * Generate 12 testcases:
848  */
849 #include "locking-selftest-hardirq.h"
850 GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion_hard)
851 
852 #include "locking-selftest-softirq.h"
853 GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion_soft)
854 
855 #undef E1
856 #undef E2
857 #undef E3
858 
859 /*
860  * read-lock / write-lock recursion that is unsafe.
861  */
862 
863 #define E1()				\
864 					\
865 	IRQ_DISABLE();			\
866 	L(B);				\
867 	WL(A);				\
868 	WU(A);				\
869 	U(B);				\
870 	IRQ_ENABLE();
871 
872 #define E2()				\
873 					\
874 	RL(A);				\
875 	RU(A);				\
876 
877 #define E3()				\
878 					\
879 	IRQ_ENTER();			\
880 	L(B);				\
881 	U(B);				\
882 	IRQ_EXIT();
883 
884 /*
885  * Generate 12 testcases:
886  */
887 #include "locking-selftest-hardirq.h"
888 // GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion2_hard)
889 
890 #include "locking-selftest-softirq.h"
891 // GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion2_soft)
892 
893 #ifdef CONFIG_DEBUG_LOCK_ALLOC
894 # define I_SPINLOCK(x)	lockdep_reset_lock(&lock_##x.dep_map)
895 # define I_RWLOCK(x)	lockdep_reset_lock(&rwlock_##x.dep_map)
896 # define I_MUTEX(x)	lockdep_reset_lock(&mutex_##x.dep_map)
897 # define I_RWSEM(x)	lockdep_reset_lock(&rwsem_##x.dep_map)
898 #else
899 # define I_SPINLOCK(x)
900 # define I_RWLOCK(x)
901 # define I_MUTEX(x)
902 # define I_RWSEM(x)
903 #endif
904 
905 #define I1(x)					\
906 	do {					\
907 		I_SPINLOCK(x);			\
908 		I_RWLOCK(x);			\
909 		I_MUTEX(x);			\
910 		I_RWSEM(x);			\
911 	} while (0)
912 
913 #define I2(x)					\
914 	do {					\
915 		spin_lock_init(&lock_##x);	\
916 		rwlock_init(&rwlock_##x);	\
917 		mutex_init(&mutex_##x);		\
918 		init_rwsem(&rwsem_##x);		\
919 	} while (0)
920 
921 static void reset_locks(void)
922 {
923 	local_irq_disable();
924 	I1(A); I1(B); I1(C); I1(D);
925 	I1(X1); I1(X2); I1(Y1); I1(Y2); I1(Z1); I1(Z2);
926 	lockdep_reset();
927 	I2(A); I2(B); I2(C); I2(D);
928 	init_shared_classes();
929 	local_irq_enable();
930 }
931 
932 #undef I
933 
934 static int testcase_total;
935 static int testcase_successes;
936 static int expected_testcase_failures;
937 static int unexpected_testcase_failures;
938 
939 static void dotest(void (*testcase_fn)(void), int expected, int lockclass_mask)
940 {
941 	unsigned long saved_preempt_count = preempt_count();
942 	int expected_failure = 0;
943 
944 	WARN_ON(irqs_disabled());
945 
946 	testcase_fn();
947 	/*
948 	 * Filter out expected failures:
949 	 */
950 #ifndef CONFIG_PROVE_LOCKING
951 	if ((lockclass_mask & LOCKTYPE_SPIN) && debug_locks != expected)
952 		expected_failure = 1;
953 	if ((lockclass_mask & LOCKTYPE_RWLOCK) && debug_locks != expected)
954 		expected_failure = 1;
955 	if ((lockclass_mask & LOCKTYPE_MUTEX) && debug_locks != expected)
956 		expected_failure = 1;
957 	if ((lockclass_mask & LOCKTYPE_RWSEM) && debug_locks != expected)
958 		expected_failure = 1;
959 #endif
960 	if (debug_locks != expected) {
961 		if (expected_failure) {
962 			expected_testcase_failures++;
963 			printk("failed|");
964 		} else {
965 			unexpected_testcase_failures++;
966 
967 			printk("FAILED|");
968 			dump_stack();
969 		}
970 	} else {
971 		testcase_successes++;
972 		printk("  ok  |");
973 	}
974 	testcase_total++;
975 
976 	if (debug_locks_verbose)
977 		printk(" lockclass mask: %x, debug_locks: %d, expected: %d\n",
978 			lockclass_mask, debug_locks, expected);
979 	/*
980 	 * Some tests (e.g. double-unlock) might corrupt the preemption
981 	 * count, so restore it:
982 	 */
983 	preempt_count() = saved_preempt_count;
984 #ifdef CONFIG_TRACE_IRQFLAGS
985 	if (softirq_count())
986 		current->softirqs_enabled = 0;
987 	else
988 		current->softirqs_enabled = 1;
989 #endif
990 
991 	reset_locks();
992 }
993 
994 static inline void print_testname(const char *testname)
995 {
996 	printk("%33s:", testname);
997 }
998 
999 #define DO_TESTCASE_1(desc, name, nr)				\
1000 	print_testname(desc"/"#nr);				\
1001 	dotest(name##_##nr, SUCCESS, LOCKTYPE_RWLOCK);		\
1002 	printk("\n");
1003 
1004 #define DO_TESTCASE_1B(desc, name, nr)				\
1005 	print_testname(desc"/"#nr);				\
1006 	dotest(name##_##nr, FAILURE, LOCKTYPE_RWLOCK);		\
1007 	printk("\n");
1008 
1009 #define DO_TESTCASE_3(desc, name, nr)				\
1010 	print_testname(desc"/"#nr);				\
1011 	dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN);	\
1012 	dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK);	\
1013 	dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK);	\
1014 	printk("\n");
1015 
1016 #define DO_TESTCASE_3RW(desc, name, nr)				\
1017 	print_testname(desc"/"#nr);				\
1018 	dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN|LOCKTYPE_RWLOCK);\
1019 	dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK);	\
1020 	dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK);	\
1021 	printk("\n");
1022 
1023 #define DO_TESTCASE_6(desc, name)				\
1024 	print_testname(desc);					\
1025 	dotest(name##_spin, FAILURE, LOCKTYPE_SPIN);		\
1026 	dotest(name##_wlock, FAILURE, LOCKTYPE_RWLOCK);		\
1027 	dotest(name##_rlock, FAILURE, LOCKTYPE_RWLOCK);		\
1028 	dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX);		\
1029 	dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM);		\
1030 	dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM);		\
1031 	printk("\n");
1032 
1033 #define DO_TESTCASE_6_SUCCESS(desc, name)			\
1034 	print_testname(desc);					\
1035 	dotest(name##_spin, SUCCESS, LOCKTYPE_SPIN);		\
1036 	dotest(name##_wlock, SUCCESS, LOCKTYPE_RWLOCK);		\
1037 	dotest(name##_rlock, SUCCESS, LOCKTYPE_RWLOCK);		\
1038 	dotest(name##_mutex, SUCCESS, LOCKTYPE_MUTEX);		\
1039 	dotest(name##_wsem, SUCCESS, LOCKTYPE_RWSEM);		\
1040 	dotest(name##_rsem, SUCCESS, LOCKTYPE_RWSEM);		\
1041 	printk("\n");
1042 
1043 /*
1044  * 'read' variant: rlocks must not trigger.
1045  */
1046 #define DO_TESTCASE_6R(desc, name)				\
1047 	print_testname(desc);					\
1048 	dotest(name##_spin, FAILURE, LOCKTYPE_SPIN);		\
1049 	dotest(name##_wlock, FAILURE, LOCKTYPE_RWLOCK);		\
1050 	dotest(name##_rlock, SUCCESS, LOCKTYPE_RWLOCK);		\
1051 	dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX);		\
1052 	dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM);		\
1053 	dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM);		\
1054 	printk("\n");
1055 
1056 #define DO_TESTCASE_2I(desc, name, nr)				\
1057 	DO_TESTCASE_1("hard-"desc, name##_hard, nr);		\
1058 	DO_TESTCASE_1("soft-"desc, name##_soft, nr);
1059 
1060 #define DO_TESTCASE_2IB(desc, name, nr)				\
1061 	DO_TESTCASE_1B("hard-"desc, name##_hard, nr);		\
1062 	DO_TESTCASE_1B("soft-"desc, name##_soft, nr);
1063 
1064 #define DO_TESTCASE_6I(desc, name, nr)				\
1065 	DO_TESTCASE_3("hard-"desc, name##_hard, nr);		\
1066 	DO_TESTCASE_3("soft-"desc, name##_soft, nr);
1067 
1068 #define DO_TESTCASE_6IRW(desc, name, nr)			\
1069 	DO_TESTCASE_3RW("hard-"desc, name##_hard, nr);		\
1070 	DO_TESTCASE_3RW("soft-"desc, name##_soft, nr);
1071 
1072 #define DO_TESTCASE_2x3(desc, name)				\
1073 	DO_TESTCASE_3(desc, name, 12);				\
1074 	DO_TESTCASE_3(desc, name, 21);
1075 
1076 #define DO_TESTCASE_2x6(desc, name)				\
1077 	DO_TESTCASE_6I(desc, name, 12);				\
1078 	DO_TESTCASE_6I(desc, name, 21);
1079 
1080 #define DO_TESTCASE_6x2(desc, name)				\
1081 	DO_TESTCASE_2I(desc, name, 123);			\
1082 	DO_TESTCASE_2I(desc, name, 132);			\
1083 	DO_TESTCASE_2I(desc, name, 213);			\
1084 	DO_TESTCASE_2I(desc, name, 231);			\
1085 	DO_TESTCASE_2I(desc, name, 312);			\
1086 	DO_TESTCASE_2I(desc, name, 321);
1087 
1088 #define DO_TESTCASE_6x2B(desc, name)				\
1089 	DO_TESTCASE_2IB(desc, name, 123);			\
1090 	DO_TESTCASE_2IB(desc, name, 132);			\
1091 	DO_TESTCASE_2IB(desc, name, 213);			\
1092 	DO_TESTCASE_2IB(desc, name, 231);			\
1093 	DO_TESTCASE_2IB(desc, name, 312);			\
1094 	DO_TESTCASE_2IB(desc, name, 321);
1095 
1096 #define DO_TESTCASE_6x6(desc, name)				\
1097 	DO_TESTCASE_6I(desc, name, 123);			\
1098 	DO_TESTCASE_6I(desc, name, 132);			\
1099 	DO_TESTCASE_6I(desc, name, 213);			\
1100 	DO_TESTCASE_6I(desc, name, 231);			\
1101 	DO_TESTCASE_6I(desc, name, 312);			\
1102 	DO_TESTCASE_6I(desc, name, 321);
1103 
1104 #define DO_TESTCASE_6x6RW(desc, name)				\
1105 	DO_TESTCASE_6IRW(desc, name, 123);			\
1106 	DO_TESTCASE_6IRW(desc, name, 132);			\
1107 	DO_TESTCASE_6IRW(desc, name, 213);			\
1108 	DO_TESTCASE_6IRW(desc, name, 231);			\
1109 	DO_TESTCASE_6IRW(desc, name, 312);			\
1110 	DO_TESTCASE_6IRW(desc, name, 321);
1111 
1112 
1113 void locking_selftest(void)
1114 {
1115 	/*
1116 	 * Got a locking failure before the selftest ran?
1117 	 */
1118 	if (!debug_locks) {
1119 		printk("----------------------------------\n");
1120 		printk("| Locking API testsuite disabled |\n");
1121 		printk("----------------------------------\n");
1122 		return;
1123 	}
1124 
1125 	/*
1126 	 * Run the testsuite:
1127 	 */
1128 	printk("------------------------\n");
1129 	printk("| Locking API testsuite:\n");
1130 	printk("----------------------------------------------------------------------------\n");
1131 	printk("                                 | spin |wlock |rlock |mutex | wsem | rsem |\n");
1132 	printk("  --------------------------------------------------------------------------\n");
1133 
1134 	init_shared_classes();
1135 	debug_locks_silent = !debug_locks_verbose;
1136 
1137 	DO_TESTCASE_6R("A-A deadlock", AA);
1138 	DO_TESTCASE_6R("A-B-B-A deadlock", ABBA);
1139 	DO_TESTCASE_6R("A-B-B-C-C-A deadlock", ABBCCA);
1140 	DO_TESTCASE_6R("A-B-C-A-B-C deadlock", ABCABC);
1141 	DO_TESTCASE_6R("A-B-B-C-C-D-D-A deadlock", ABBCCDDA);
1142 	DO_TESTCASE_6R("A-B-C-D-B-D-D-A deadlock", ABCDBDDA);
1143 	DO_TESTCASE_6R("A-B-C-D-B-C-D-A deadlock", ABCDBCDA);
1144 	DO_TESTCASE_6("double unlock", double_unlock);
1145 	DO_TESTCASE_6("initialize held", init_held);
1146 	DO_TESTCASE_6_SUCCESS("bad unlock order", bad_unlock_order);
1147 
1148 	printk("  --------------------------------------------------------------------------\n");
1149 	print_testname("recursive read-lock");
1150 	printk("             |");
1151 	dotest(rlock_AA1, SUCCESS, LOCKTYPE_RWLOCK);
1152 	printk("             |");
1153 	dotest(rsem_AA1, FAILURE, LOCKTYPE_RWSEM);
1154 	printk("\n");
1155 
1156 	print_testname("recursive read-lock #2");
1157 	printk("             |");
1158 	dotest(rlock_AA1B, SUCCESS, LOCKTYPE_RWLOCK);
1159 	printk("             |");
1160 	dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM);
1161 	printk("\n");
1162 
1163 	print_testname("mixed read-write-lock");
1164 	printk("             |");
1165 	dotest(rlock_AA2, FAILURE, LOCKTYPE_RWLOCK);
1166 	printk("             |");
1167 	dotest(rsem_AA2, FAILURE, LOCKTYPE_RWSEM);
1168 	printk("\n");
1169 
1170 	print_testname("mixed write-read-lock");
1171 	printk("             |");
1172 	dotest(rlock_AA3, FAILURE, LOCKTYPE_RWLOCK);
1173 	printk("             |");
1174 	dotest(rsem_AA3, FAILURE, LOCKTYPE_RWSEM);
1175 	printk("\n");
1176 
1177 	printk("  --------------------------------------------------------------------------\n");
1178 
1179 	/*
1180 	 * irq-context testcases:
1181 	 */
1182 	DO_TESTCASE_2x6("irqs-on + irq-safe-A", irqsafe1);
1183 	DO_TESTCASE_2x3("sirq-safe-A => hirqs-on", irqsafe2A);
1184 	DO_TESTCASE_2x6("safe-A + irqs-on", irqsafe2B);
1185 	DO_TESTCASE_6x6("safe-A + unsafe-B #1", irqsafe3);
1186 	DO_TESTCASE_6x6("safe-A + unsafe-B #2", irqsafe4);
1187 	DO_TESTCASE_6x6RW("irq lock-inversion", irq_inversion);
1188 
1189 	DO_TESTCASE_6x2("irq read-recursion", irq_read_recursion);
1190 //	DO_TESTCASE_6x2B("irq read-recursion #2", irq_read_recursion2);
1191 
1192 	if (unexpected_testcase_failures) {
1193 		printk("-----------------------------------------------------------------\n");
1194 		debug_locks = 0;
1195 		printk("BUG: %3d unexpected failures (out of %3d) - debugging disabled! |\n",
1196 			unexpected_testcase_failures, testcase_total);
1197 		printk("-----------------------------------------------------------------\n");
1198 	} else if (expected_testcase_failures && testcase_successes) {
1199 		printk("--------------------------------------------------------\n");
1200 		printk("%3d out of %3d testcases failed, as expected. |\n",
1201 			expected_testcase_failures, testcase_total);
1202 		printk("----------------------------------------------------\n");
1203 		debug_locks = 1;
1204 	} else if (expected_testcase_failures && !testcase_successes) {
1205 		printk("--------------------------------------------------------\n");
1206 		printk("All %3d testcases failed, as expected. |\n",
1207 			expected_testcase_failures);
1208 		printk("----------------------------------------\n");
1209 		debug_locks = 1;
1210 	} else {
1211 		printk("-------------------------------------------------------\n");
1212 		printk("Good, all %3d testcases passed! |\n",
1213 			testcase_successes);
1214 		printk("---------------------------------\n");
1215 		debug_locks = 1;
1216 	}
1217 	debug_locks_silent = 0;
1218 }
1219