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