Root/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 */
28static unsigned int debug_locks_verbose;
29
30static 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 */
51static DEFINE_SPINLOCK(lock_A);
52static DEFINE_SPINLOCK(lock_B);
53static DEFINE_SPINLOCK(lock_C);
54static DEFINE_SPINLOCK(lock_D);
55
56static DEFINE_RWLOCK(rwlock_A);
57static DEFINE_RWLOCK(rwlock_B);
58static DEFINE_RWLOCK(rwlock_C);
59static DEFINE_RWLOCK(rwlock_D);
60
61static DEFINE_MUTEX(mutex_A);
62static DEFINE_MUTEX(mutex_B);
63static DEFINE_MUTEX(mutex_C);
64static DEFINE_MUTEX(mutex_D);
65
66static DECLARE_RWSEM(rwsem_A);
67static DECLARE_RWSEM(rwsem_B);
68static DECLARE_RWSEM(rwsem_C);
69static 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 */
77static DEFINE_SPINLOCK(lock_X1);
78static DEFINE_SPINLOCK(lock_X2);
79static DEFINE_SPINLOCK(lock_Y1);
80static DEFINE_SPINLOCK(lock_Y2);
81static DEFINE_SPINLOCK(lock_Z1);
82static DEFINE_SPINLOCK(lock_Z2);
83
84static DEFINE_RWLOCK(rwlock_X1);
85static DEFINE_RWLOCK(rwlock_X2);
86static DEFINE_RWLOCK(rwlock_Y1);
87static DEFINE_RWLOCK(rwlock_Y2);
88static DEFINE_RWLOCK(rwlock_Z1);
89static DEFINE_RWLOCK(rwlock_Z2);
90
91static DEFINE_MUTEX(mutex_X1);
92static DEFINE_MUTEX(mutex_X2);
93static DEFINE_MUTEX(mutex_Y1);
94static DEFINE_MUTEX(mutex_Y2);
95static DEFINE_MUTEX(mutex_Z1);
96static DEFINE_MUTEX(mutex_Z2);
97
98static DECLARE_RWSEM(rwsem_X1);
99static DECLARE_RWSEM(rwsem_X2);
100static DECLARE_RWSEM(rwsem_Y1);
101static DECLARE_RWSEM(rwsem_Y2);
102static DECLARE_RWSEM(rwsem_Z1);
103static 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) \
110static noinline void \
111init_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
120INIT_CLASS_FUNC(X)
121INIT_CLASS_FUNC(Y)
122INIT_CLASS_FUNC(Z)
123
124static 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                        \
206static void name(void) { E(); }
207
208#define GENERATE_PERMUTATIONS_2_EVENTS(name) \
209                        \
210static void name##_12(void) { E1(); E2(); } \
211static void name##_21(void) { E2(); E1(); }
212
213#define GENERATE_PERMUTATIONS_3_EVENTS(name) \
214                            \
215static void name##_123(void) { E1(); E2(); E3(); } \
216static void name##_132(void) { E1(); E3(); E2(); } \
217static void name##_213(void) { E2(); E1(); E3(); } \
218static void name##_231(void) { E2(); E3(); E1(); } \
219static void name##_312(void) { E3(); E1(); E2(); } \
220static 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"
235GENERATE_TESTCASE(AA_spin)
236#include "locking-selftest-wlock.h"
237GENERATE_TESTCASE(AA_wlock)
238#include "locking-selftest-rlock.h"
239GENERATE_TESTCASE(AA_rlock)
240#include "locking-selftest-mutex.h"
241GENERATE_TESTCASE(AA_mutex)
242#include "locking-selftest-wsem.h"
243GENERATE_TESTCASE(AA_wsem)
244#include "locking-selftest-rsem.h"
245GENERATE_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 */
253static void rlock_AA1(void)
254{
255    RL(X1);
256    RL(X1); // this one should NOT fail
257}
258
259static void rlock_AA1B(void)
260{
261    RL(X1);
262    RL(X2); // this one should NOT fail
263}
264
265static void rsem_AA1(void)
266{
267    RSL(X1);
268    RSL(X1); // this one should fail
269}
270
271static 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 */
279static void rlock_AA2(void)
280{
281    RL(X1);
282    WL(X2); // this one should fail
283}
284
285static void rsem_AA2(void)
286{
287    RSL(X1);
288    WSL(X2); // this one should fail
289}
290
291static void rlock_AA3(void)
292{
293    WL(X1);
294    RL(X2); // this one should fail
295}
296
297static 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"
316GENERATE_TESTCASE(ABBA_spin)
317#include "locking-selftest-wlock.h"
318GENERATE_TESTCASE(ABBA_wlock)
319#include "locking-selftest-rlock.h"
320GENERATE_TESTCASE(ABBA_rlock)
321#include "locking-selftest-mutex.h"
322GENERATE_TESTCASE(ABBA_mutex)
323#include "locking-selftest-wsem.h"
324GENERATE_TESTCASE(ABBA_wsem)
325#include "locking-selftest-rsem.h"
326GENERATE_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"
344GENERATE_TESTCASE(ABBCCA_spin)
345#include "locking-selftest-wlock.h"
346GENERATE_TESTCASE(ABBCCA_wlock)
347#include "locking-selftest-rlock.h"
348GENERATE_TESTCASE(ABBCCA_rlock)
349#include "locking-selftest-mutex.h"
350GENERATE_TESTCASE(ABBCCA_mutex)
351#include "locking-selftest-wsem.h"
352GENERATE_TESTCASE(ABBCCA_wsem)
353#include "locking-selftest-rsem.h"
354GENERATE_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"
372GENERATE_TESTCASE(ABCABC_spin)
373#include "locking-selftest-wlock.h"
374GENERATE_TESTCASE(ABCABC_wlock)
375#include "locking-selftest-rlock.h"
376GENERATE_TESTCASE(ABCABC_rlock)
377#include "locking-selftest-mutex.h"
378GENERATE_TESTCASE(ABCABC_mutex)
379#include "locking-selftest-wsem.h"
380GENERATE_TESTCASE(ABCABC_wsem)
381#include "locking-selftest-rsem.h"
382GENERATE_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"
401GENERATE_TESTCASE(ABBCCDDA_spin)
402#include "locking-selftest-wlock.h"
403GENERATE_TESTCASE(ABBCCDDA_wlock)
404#include "locking-selftest-rlock.h"
405GENERATE_TESTCASE(ABBCCDDA_rlock)
406#include "locking-selftest-mutex.h"
407GENERATE_TESTCASE(ABBCCDDA_mutex)
408#include "locking-selftest-wsem.h"
409GENERATE_TESTCASE(ABBCCDDA_wsem)
410#include "locking-selftest-rsem.h"
411GENERATE_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"
429GENERATE_TESTCASE(ABCDBDDA_spin)
430#include "locking-selftest-wlock.h"
431GENERATE_TESTCASE(ABCDBDDA_wlock)
432#include "locking-selftest-rlock.h"
433GENERATE_TESTCASE(ABCDBDDA_rlock)
434#include "locking-selftest-mutex.h"
435GENERATE_TESTCASE(ABCDBDDA_mutex)
436#include "locking-selftest-wsem.h"
437GENERATE_TESTCASE(ABCDBDDA_wsem)
438#include "locking-selftest-rsem.h"
439GENERATE_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"
457GENERATE_TESTCASE(ABCDBCDA_spin)
458#include "locking-selftest-wlock.h"
459GENERATE_TESTCASE(ABCDBCDA_wlock)
460#include "locking-selftest-rlock.h"
461GENERATE_TESTCASE(ABCDBCDA_rlock)
462#include "locking-selftest-mutex.h"
463GENERATE_TESTCASE(ABCDBCDA_mutex)
464#include "locking-selftest-wsem.h"
465GENERATE_TESTCASE(ABCDBCDA_wsem)
466#include "locking-selftest-rsem.h"
467GENERATE_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"
484GENERATE_TESTCASE(double_unlock_spin)
485#include "locking-selftest-wlock.h"
486GENERATE_TESTCASE(double_unlock_wlock)
487#include "locking-selftest-rlock.h"
488GENERATE_TESTCASE(double_unlock_rlock)
489#include "locking-selftest-mutex.h"
490GENERATE_TESTCASE(double_unlock_mutex)
491#include "locking-selftest-wsem.h"
492GENERATE_TESTCASE(double_unlock_wsem)
493#include "locking-selftest-rsem.h"
494GENERATE_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"
512GENERATE_TESTCASE(bad_unlock_order_spin)
513#include "locking-selftest-wlock.h"
514GENERATE_TESTCASE(bad_unlock_order_wlock)
515#include "locking-selftest-rlock.h"
516GENERATE_TESTCASE(bad_unlock_order_rlock)
517#include "locking-selftest-mutex.h"
518GENERATE_TESTCASE(bad_unlock_order_mutex)
519#include "locking-selftest-wsem.h"
520GENERATE_TESTCASE(bad_unlock_order_wsem)
521#include "locking-selftest-rsem.h"
522GENERATE_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"
538GENERATE_TESTCASE(init_held_spin)
539#include "locking-selftest-wlock.h"
540GENERATE_TESTCASE(init_held_wlock)
541#include "locking-selftest-rlock.h"
542GENERATE_TESTCASE(init_held_rlock)
543#include "locking-selftest-mutex.h"
544GENERATE_TESTCASE(init_held_mutex)
545#include "locking-selftest-wsem.h"
546GENERATE_TESTCASE(init_held_wsem)
547#include "locking-selftest-rsem.h"
548GENERATE_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"
571GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin)
572
573#include "locking-selftest-rlock-hardirq.h"
574GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_rlock)
575
576#include "locking-selftest-wlock-hardirq.h"
577GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_wlock)
578
579#include "locking-selftest-spin-softirq.h"
580GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_spin)
581
582#include "locking-selftest-rlock-softirq.h"
583GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_rlock)
584
585#include "locking-selftest-wlock-softirq.h"
586GENERATE_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"
612GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_spin)
613
614#include "locking-selftest-wlock.h"
615GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_wlock)
616
617#include "locking-selftest-rlock.h"
618GENERATE_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"
644GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_spin)
645
646#include "locking-selftest-rlock-hardirq.h"
647GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_rlock)
648
649#include "locking-selftest-wlock-hardirq.h"
650GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_wlock)
651
652#include "locking-selftest-spin-softirq.h"
653GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_spin)
654
655#include "locking-selftest-rlock-softirq.h"
656GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_rlock)
657
658#include "locking-selftest-wlock-softirq.h"
659GENERATE_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"
690GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_spin)
691
692#include "locking-selftest-rlock-hardirq.h"
693GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_rlock)
694
695#include "locking-selftest-wlock-hardirq.h"
696GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_wlock)
697
698#include "locking-selftest-spin-softirq.h"
699GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_spin)
700
701#include "locking-selftest-rlock-softirq.h"
702GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_rlock)
703
704#include "locking-selftest-wlock-softirq.h"
705GENERATE_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"
738GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_spin)
739
740#include "locking-selftest-rlock-hardirq.h"
741GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_rlock)
742
743#include "locking-selftest-wlock-hardirq.h"
744GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_wlock)
745
746#include "locking-selftest-spin-softirq.h"
747GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_spin)
748
749#include "locking-selftest-rlock-softirq.h"
750GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_rlock)
751
752#include "locking-selftest-wlock-softirq.h"
753GENERATE_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"
800GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_hard_spin)
801
802#include "locking-selftest-rlock-hardirq.h"
803GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_hard_rlock)
804
805#include "locking-selftest-wlock-hardirq.h"
806GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_hard_wlock)
807
808#include "locking-selftest-spin-softirq.h"
809GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_spin)
810
811#include "locking-selftest-rlock-softirq.h"
812GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_rlock)
813
814#include "locking-selftest-wlock-softirq.h"
815GENERATE_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"
850GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion_hard)
851
852#include "locking-selftest-softirq.h"
853GENERATE_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
921static 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
934static int testcase_total;
935static int testcase_successes;
936static int expected_testcase_failures;
937static int unexpected_testcase_failures;
938
939static 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
994static 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
1113void 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

Archive Download this file



interactive