lockdep_internals.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /*
  2. * kernel/lockdep_internals.h
  3. *
  4. * Runtime locking correctness validator
  5. *
  6. * lockdep subsystem internal functions and variables.
  7. */
  8. /*
  9. * Lock-class usage-state bits:
  10. */
  11. enum lock_usage_bit {
  12. LOCK_USED = 0,
  13. LOCK_USED_IN_HARDIRQ,
  14. LOCK_USED_IN_SOFTIRQ,
  15. LOCK_USED_IN_RECLAIM_FS,
  16. LOCK_ENABLED_SOFTIRQ,
  17. LOCK_ENABLED_HARDIRQ,
  18. LOCK_ENABLED_RECLAIM_FS,
  19. LOCK_USED_IN_HARDIRQ_READ,
  20. LOCK_USED_IN_SOFTIRQ_READ,
  21. LOCK_USED_IN_RECLAIM_FS_READ,
  22. LOCK_ENABLED_SOFTIRQ_READ,
  23. LOCK_ENABLED_HARDIRQ_READ,
  24. LOCK_ENABLED_RECLAIM_FS_READ,
  25. LOCK_USAGE_STATES
  26. };
  27. /*
  28. * Usage-state bitmasks:
  29. */
  30. #define LOCKF_USED (1 << LOCK_USED)
  31. #define LOCKF_USED_IN_HARDIRQ (1 << LOCK_USED_IN_HARDIRQ)
  32. #define LOCKF_USED_IN_SOFTIRQ (1 << LOCK_USED_IN_SOFTIRQ)
  33. #define LOCKF_USED_IN_RECLAIM_FS (1 << LOCK_USED_IN_RECLAIM_FS)
  34. #define LOCKF_ENABLED_HARDIRQ (1 << LOCK_ENABLED_HARDIRQ)
  35. #define LOCKF_ENABLED_SOFTIRQ (1 << LOCK_ENABLED_SOFTIRQ)
  36. #define LOCKF_ENABLED_RECLAIM_FS (1 << LOCK_ENABLED_RECLAIM_FS)
  37. #define LOCKF_ENABLED_IRQ (LOCKF_ENABLED_HARDIRQ | LOCKF_ENABLED_SOFTIRQ)
  38. #define LOCKF_USED_IN_IRQ (LOCKF_USED_IN_HARDIRQ | LOCKF_USED_IN_SOFTIRQ)
  39. #define LOCKF_USED_IN_HARDIRQ_READ (1 << LOCK_USED_IN_HARDIRQ_READ)
  40. #define LOCKF_USED_IN_SOFTIRQ_READ (1 << LOCK_USED_IN_SOFTIRQ_READ)
  41. #define LOCKF_USED_IN_RECLAIM_FS_READ (1 << LOCK_USED_IN_RECLAIM_FS_READ)
  42. #define LOCKF_ENABLED_HARDIRQ_READ (1 << LOCK_ENABLED_HARDIRQ_READ)
  43. #define LOCKF_ENABLED_SOFTIRQ_READ (1 << LOCK_ENABLED_SOFTIRQ_READ)
  44. #define LOCKF_ENABLED_RECLAIM_FS_READ (1 << LOCK_ENABLED_RECLAIM_FS_READ)
  45. #define LOCKF_ENABLED_IRQ_READ \
  46. (LOCKF_ENABLED_HARDIRQ_READ | LOCKF_ENABLED_SOFTIRQ_READ)
  47. #define LOCKF_USED_IN_IRQ_READ \
  48. (LOCKF_USED_IN_HARDIRQ_READ | LOCKF_USED_IN_SOFTIRQ_READ)
  49. /*
  50. * MAX_LOCKDEP_ENTRIES is the maximum number of lock dependencies
  51. * we track.
  52. *
  53. * We use the per-lock dependency maps in two ways: we grow it by adding
  54. * every to-be-taken lock to all currently held lock's own dependency
  55. * table (if it's not there yet), and we check it for lock order
  56. * conflicts and deadlocks.
  57. */
  58. #define MAX_LOCKDEP_ENTRIES 8192UL
  59. #define MAX_LOCKDEP_CHAINS_BITS 14
  60. #define MAX_LOCKDEP_CHAINS (1UL << MAX_LOCKDEP_CHAINS_BITS)
  61. #define MAX_LOCKDEP_CHAIN_HLOCKS (MAX_LOCKDEP_CHAINS*5)
  62. /*
  63. * Stack-trace: tightly packed array of stack backtrace
  64. * addresses. Protected by the hash_lock.
  65. */
  66. #define MAX_STACK_TRACE_ENTRIES 262144UL
  67. extern struct list_head all_lock_classes;
  68. extern struct lock_chain lock_chains[];
  69. extern void
  70. get_usage_chars(struct lock_class *class, char *c1, char *c2, char *c3,
  71. char *c4, char *c5, char *c6);
  72. extern const char * __get_key_name(struct lockdep_subclass_key *key, char *str);
  73. struct lock_class *lock_chain_get_class(struct lock_chain *chain, int i);
  74. extern unsigned long nr_lock_classes;
  75. extern unsigned long nr_list_entries;
  76. extern unsigned long nr_lock_chains;
  77. extern int nr_chain_hlocks;
  78. extern unsigned long nr_stack_trace_entries;
  79. extern unsigned int nr_hardirq_chains;
  80. extern unsigned int nr_softirq_chains;
  81. extern unsigned int nr_process_chains;
  82. extern unsigned int max_lockdep_depth;
  83. extern unsigned int max_recursion_depth;
  84. #ifdef CONFIG_PROVE_LOCKING
  85. extern unsigned long lockdep_count_forward_deps(struct lock_class *);
  86. extern unsigned long lockdep_count_backward_deps(struct lock_class *);
  87. #else
  88. static inline unsigned long
  89. lockdep_count_forward_deps(struct lock_class *class)
  90. {
  91. return 0;
  92. }
  93. static inline unsigned long
  94. lockdep_count_backward_deps(struct lock_class *class)
  95. {
  96. return 0;
  97. }
  98. #endif
  99. #ifdef CONFIG_DEBUG_LOCKDEP
  100. /*
  101. * Various lockdep statistics:
  102. */
  103. extern atomic_t chain_lookup_hits;
  104. extern atomic_t chain_lookup_misses;
  105. extern atomic_t hardirqs_on_events;
  106. extern atomic_t hardirqs_off_events;
  107. extern atomic_t redundant_hardirqs_on;
  108. extern atomic_t redundant_hardirqs_off;
  109. extern atomic_t softirqs_on_events;
  110. extern atomic_t softirqs_off_events;
  111. extern atomic_t redundant_softirqs_on;
  112. extern atomic_t redundant_softirqs_off;
  113. extern atomic_t nr_unused_locks;
  114. extern atomic_t nr_cyclic_checks;
  115. extern atomic_t nr_cyclic_check_recursions;
  116. extern atomic_t nr_find_usage_forwards_checks;
  117. extern atomic_t nr_find_usage_forwards_recursions;
  118. extern atomic_t nr_find_usage_backwards_checks;
  119. extern atomic_t nr_find_usage_backwards_recursions;
  120. # define debug_atomic_inc(ptr) atomic_inc(ptr)
  121. # define debug_atomic_dec(ptr) atomic_dec(ptr)
  122. # define debug_atomic_read(ptr) atomic_read(ptr)
  123. #else
  124. # define debug_atomic_inc(ptr) do { } while (0)
  125. # define debug_atomic_dec(ptr) do { } while (0)
  126. # define debug_atomic_read(ptr) 0
  127. #endif