linux/lib/locking-selftest.c
<<
>>
Prefs
   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
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.