Blame view

kernel/lockdep_internals.h 3.89 KB
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
1
2
3
4
5
6
7
8
9
  /*
   * kernel/lockdep_internals.h
   *
   * Runtime locking correctness validator
   *
   * lockdep subsystem internal functions and variables.
   */
  
  /*
9851673bc   Peter Zijlstra   lockdep: move sta...
10
11
12
   * Lock-class usage-state bits:
   */
  enum lock_usage_bit {
d7b1b0213   Peter Zijlstra   lockdep: generate...
13
14
15
16
17
18
19
20
  #define LOCKDEP_STATE(__STATE)		\
  	LOCK_USED_IN_##__STATE,		\
  	LOCK_USED_IN_##__STATE##_READ,	\
  	LOCK_ENABLED_##__STATE,		\
  	LOCK_ENABLED_##__STATE##_READ,
  #include "lockdep_states.h"
  #undef LOCKDEP_STATE
  	LOCK_USED,
9851673bc   Peter Zijlstra   lockdep: move sta...
21
22
23
24
25
26
  	LOCK_USAGE_STATES
  };
  
  /*
   * Usage-state bitmasks:
   */
d7b1b0213   Peter Zijlstra   lockdep: generate...
27
28
29
30
31
32
33
34
35
36
37
38
  #define __LOCKF(__STATE)	LOCKF_##__STATE = (1 << LOCK_##__STATE),
  
  enum {
  #define LOCKDEP_STATE(__STATE)						\
  	__LOCKF(USED_IN_##__STATE)					\
  	__LOCKF(USED_IN_##__STATE##_READ)				\
  	__LOCKF(ENABLED_##__STATE)					\
  	__LOCKF(ENABLED_##__STATE##_READ)
  #include "lockdep_states.h"
  #undef LOCKDEP_STATE
  	__LOCKF(USED)
  };
9851673bc   Peter Zijlstra   lockdep: move sta...
39
40
41
  
  #define LOCKF_ENABLED_IRQ (LOCKF_ENABLED_HARDIRQ | LOCKF_ENABLED_SOFTIRQ)
  #define LOCKF_USED_IN_IRQ (LOCKF_USED_IN_HARDIRQ | LOCKF_USED_IN_SOFTIRQ)
9851673bc   Peter Zijlstra   lockdep: move sta...
42
43
44
45
46
47
  #define LOCKF_ENABLED_IRQ_READ \
  		(LOCKF_ENABLED_HARDIRQ_READ | LOCKF_ENABLED_SOFTIRQ_READ)
  #define LOCKF_USED_IN_IRQ_READ \
  		(LOCKF_USED_IN_HARDIRQ_READ | LOCKF_USED_IN_SOFTIRQ_READ)
  
  /*
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
48
49
50
51
52
53
54
55
56
   * MAX_LOCKDEP_ENTRIES is the maximum number of lock dependencies
   * we track.
   *
   * We use the per-lock dependency maps in two ways: we grow it by adding
   * every to-be-taken lock to all currently held lock's own dependency
   * table (if it's not there yet), and we check it for lock order
   * conflicts and deadlocks.
   */
  #define MAX_LOCKDEP_ENTRIES	8192UL
50cc670ae   Ingo Molnar   [PATCH] lockdep: ...
57
  #define MAX_LOCKDEP_CHAINS_BITS	14
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
58
  #define MAX_LOCKDEP_CHAINS	(1UL << MAX_LOCKDEP_CHAINS_BITS)
443cd507c   Huang, Ying   lockdep: add lock...
59
  #define MAX_LOCKDEP_CHAIN_HLOCKS (MAX_LOCKDEP_CHAINS*5)
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
60
61
62
63
  /*
   * Stack-trace: tightly packed array of stack backtrace
   * addresses. Protected by the hash_lock.
   */
9bb25bf36   Ingo Molnar   [PATCH] lockdep: ...
64
  #define MAX_STACK_TRACE_ENTRIES	262144UL
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
65
66
  
  extern struct list_head all_lock_classes;
443cd507c   Huang, Ying   lockdep: add lock...
67
  extern struct lock_chain lock_chains[];
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
68

f510b233c   Peter Zijlstra   lockdep: get_user...
69
70
71
72
  #define LOCK_USAGE_CHARS (1+LOCK_USAGE_STATES/2)
  
  extern void get_usage_chars(struct lock_class *class,
  			    char usage[LOCK_USAGE_CHARS]);
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
73
74
  
  extern const char * __get_key_name(struct lockdep_subclass_key *key, char *str);
443cd507c   Huang, Ying   lockdep: add lock...
75
  struct lock_class *lock_chain_get_class(struct lock_chain *chain, int i);
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
76
77
78
  extern unsigned long nr_lock_classes;
  extern unsigned long nr_list_entries;
  extern unsigned long nr_lock_chains;
cd1a28e84   Huang, Ying   lockdep: add lock...
79
  extern int nr_chain_hlocks;
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
80
81
82
83
84
85
86
  extern unsigned long nr_stack_trace_entries;
  
  extern unsigned int nr_hardirq_chains;
  extern unsigned int nr_softirq_chains;
  extern unsigned int nr_process_chains;
  extern unsigned int max_lockdep_depth;
  extern unsigned int max_recursion_depth;
d6672c501   Ingo Molnar   lockdep: build fix
87
  #ifdef CONFIG_PROVE_LOCKING
419ca3f13   David Miller   lockdep: fix comb...
88
89
  extern unsigned long lockdep_count_forward_deps(struct lock_class *);
  extern unsigned long lockdep_count_backward_deps(struct lock_class *);
d6672c501   Ingo Molnar   lockdep: build fix
90
91
92
93
94
95
96
97
98
99
100
101
  #else
  static inline unsigned long
  lockdep_count_forward_deps(struct lock_class *class)
  {
  	return 0;
  }
  static inline unsigned long
  lockdep_count_backward_deps(struct lock_class *class)
  {
  	return 0;
  }
  #endif
419ca3f13   David Miller   lockdep: fix comb...
102

fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  #ifdef CONFIG_DEBUG_LOCKDEP
  /*
   * Various lockdep statistics:
   */
  extern atomic_t chain_lookup_hits;
  extern atomic_t chain_lookup_misses;
  extern atomic_t hardirqs_on_events;
  extern atomic_t hardirqs_off_events;
  extern atomic_t redundant_hardirqs_on;
  extern atomic_t redundant_hardirqs_off;
  extern atomic_t softirqs_on_events;
  extern atomic_t softirqs_off_events;
  extern atomic_t redundant_softirqs_on;
  extern atomic_t redundant_softirqs_off;
  extern atomic_t nr_unused_locks;
  extern atomic_t nr_cyclic_checks;
  extern atomic_t nr_cyclic_check_recursions;
  extern atomic_t nr_find_usage_forwards_checks;
  extern atomic_t nr_find_usage_forwards_recursions;
  extern atomic_t nr_find_usage_backwards_checks;
  extern atomic_t nr_find_usage_backwards_recursions;
  # define debug_atomic_inc(ptr)		atomic_inc(ptr)
  # define debug_atomic_dec(ptr)		atomic_dec(ptr)
  # define debug_atomic_read(ptr)		atomic_read(ptr)
  #else
  # define debug_atomic_inc(ptr)		do { } while (0)
  # define debug_atomic_dec(ptr)		do { } while (0)
  # define debug_atomic_read(ptr)		0
  #endif