V4L/DVB (11956): dsbr100: no need to pass curfreq value to dsbr100_setfreq()
[linux-2.6] / lib / locking-selftest.c
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 }