blob: 8f946f614f8e1886296e6fbef07bcd9f77838789 [file] [log] [blame]
Ingo Molnarfbb9ce952006-07-03 00:24:50 -07001/*
2 * Runtime locking correctness validator
3 *
4 * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
5 *
6 * see Documentation/lockdep-design.txt for more details.
7 */
8#ifndef __LINUX_LOCKDEP_H
9#define __LINUX_LOCKDEP_H
10
Heiko Carstensa1e96b02007-02-12 00:52:20 -080011struct task_struct;
Peter Zijlstraf20786f2007-07-19 01:48:56 -070012struct lockdep_map;
Heiko Carstensa1e96b02007-02-12 00:52:20 -080013
Michael S. Tsirkindb0b0ea2006-09-29 01:59:28 -070014#ifdef CONFIG_LOCKDEP
15
Ingo Molnarfbb9ce952006-07-03 00:24:50 -070016#include <linux/linkage.h>
17#include <linux/list.h>
18#include <linux/debug_locks.h>
19#include <linux/stacktrace.h>
20
Ingo Molnarfbb9ce952006-07-03 00:24:50 -070021/*
22 * Lock-class usage-state bits:
23 */
24enum lock_usage_bit
25{
26 LOCK_USED = 0,
27 LOCK_USED_IN_HARDIRQ,
28 LOCK_USED_IN_SOFTIRQ,
29 LOCK_ENABLED_SOFTIRQS,
30 LOCK_ENABLED_HARDIRQS,
31 LOCK_USED_IN_HARDIRQ_READ,
32 LOCK_USED_IN_SOFTIRQ_READ,
33 LOCK_ENABLED_SOFTIRQS_READ,
34 LOCK_ENABLED_HARDIRQS_READ,
35 LOCK_USAGE_STATES
36};
37
38/*
39 * Usage-state bitmasks:
40 */
41#define LOCKF_USED (1 << LOCK_USED)
42#define LOCKF_USED_IN_HARDIRQ (1 << LOCK_USED_IN_HARDIRQ)
43#define LOCKF_USED_IN_SOFTIRQ (1 << LOCK_USED_IN_SOFTIRQ)
44#define LOCKF_ENABLED_HARDIRQS (1 << LOCK_ENABLED_HARDIRQS)
45#define LOCKF_ENABLED_SOFTIRQS (1 << LOCK_ENABLED_SOFTIRQS)
46
47#define LOCKF_ENABLED_IRQS (LOCKF_ENABLED_HARDIRQS | LOCKF_ENABLED_SOFTIRQS)
48#define LOCKF_USED_IN_IRQ (LOCKF_USED_IN_HARDIRQ | LOCKF_USED_IN_SOFTIRQ)
49
50#define LOCKF_USED_IN_HARDIRQ_READ (1 << LOCK_USED_IN_HARDIRQ_READ)
51#define LOCKF_USED_IN_SOFTIRQ_READ (1 << LOCK_USED_IN_SOFTIRQ_READ)
52#define LOCKF_ENABLED_HARDIRQS_READ (1 << LOCK_ENABLED_HARDIRQS_READ)
53#define LOCKF_ENABLED_SOFTIRQS_READ (1 << LOCK_ENABLED_SOFTIRQS_READ)
54
55#define LOCKF_ENABLED_IRQS_READ \
56 (LOCKF_ENABLED_HARDIRQS_READ | LOCKF_ENABLED_SOFTIRQS_READ)
57#define LOCKF_USED_IN_IRQ_READ \
58 (LOCKF_USED_IN_HARDIRQ_READ | LOCKF_USED_IN_SOFTIRQ_READ)
59
60#define MAX_LOCKDEP_SUBCLASSES 8UL
61
62/*
63 * Lock-classes are keyed via unique addresses, by embedding the
64 * lockclass-key into the kernel (or module) .data section. (For
65 * static locks we use the lock address itself as the key.)
66 */
67struct lockdep_subclass_key {
68 char __one_byte;
69} __attribute__ ((__packed__));
70
71struct lock_class_key {
72 struct lockdep_subclass_key subkeys[MAX_LOCKDEP_SUBCLASSES];
73};
74
75/*
76 * The lock-class itself:
77 */
78struct lock_class {
79 /*
80 * class-hash:
81 */
82 struct list_head hash_entry;
83
84 /*
85 * global list of all lock-classes:
86 */
87 struct list_head lock_entry;
88
89 struct lockdep_subclass_key *key;
90 unsigned int subclass;
91
92 /*
93 * IRQ/softirq usage tracking bits:
94 */
95 unsigned long usage_mask;
96 struct stack_trace usage_traces[LOCK_USAGE_STATES];
97
98 /*
99 * These fields represent a directed graph of lock dependencies,
100 * to every node we attach a list of "forward" and a list of
101 * "backward" graph nodes.
102 */
103 struct list_head locks_after, locks_before;
104
105 /*
106 * Generation counter, when doing certain classes of graph walking,
107 * to ensure that we check one node only once:
108 */
109 unsigned int version;
110
111 /*
112 * Statistics counter:
113 */
114 unsigned long ops;
115
116 const char *name;
117 int name_version;
Peter Zijlstraf20786f2007-07-19 01:48:56 -0700118
119#ifdef CONFIG_LOCK_STAT
120 unsigned long contention_point[4];
121#endif
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700122};
123
Peter Zijlstraf20786f2007-07-19 01:48:56 -0700124#ifdef CONFIG_LOCK_STAT
125struct lock_time {
126 s64 min;
127 s64 max;
128 s64 total;
129 unsigned long nr;
130};
131
132struct lock_class_stats {
133 unsigned long contention_point[4];
134 struct lock_time read_waittime;
135 struct lock_time write_waittime;
136 struct lock_time read_holdtime;
137 struct lock_time write_holdtime;
138};
139
140struct lock_class_stats lock_stats(struct lock_class *class);
141void clear_lock_stats(struct lock_class *class);
142#endif
143
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700144/*
145 * Map the lock object (the lock instance) to the lock-class object.
146 * This is embedded into specific lock instances:
147 */
148struct lockdep_map {
149 struct lock_class_key *key;
Ingo Molnard6d897c2006-07-10 04:44:04 -0700150 struct lock_class *class_cache;
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700151 const char *name;
152};
153
154/*
155 * Every lock has a list of other locks that were taken after it.
156 * We only grow the list, never remove from it:
157 */
158struct lock_list {
159 struct list_head entry;
160 struct lock_class *class;
161 struct stack_trace trace;
Jason Baron068135e2007-02-10 01:44:59 -0800162 int distance;
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700163};
164
165/*
166 * We record lock dependency chains, so that we can cache them:
167 */
168struct lock_chain {
169 struct list_head entry;
170 u64 chain_key;
171};
172
173struct held_lock {
174 /*
175 * One-way hash of the dependency chain up to this point. We
176 * hash the hashes step by step as the dependency chain grows.
177 *
178 * We use it for dependency-caching and we skip detection
179 * passes and dependency-updates if there is a cache-hit, so
180 * it is absolutely critical for 100% coverage of the validator
181 * to have a unique key value for every unique dependency path
182 * that can occur in the system, to make a unique hash value
183 * as likely as possible - hence the 64-bit width.
184 *
185 * The task struct holds the current hash value (initialized
186 * with zero), here we store the previous hash value:
187 */
188 u64 prev_chain_key;
189 struct lock_class *class;
190 unsigned long acquire_ip;
191 struct lockdep_map *instance;
192
Peter Zijlstraf20786f2007-07-19 01:48:56 -0700193#ifdef CONFIG_LOCK_STAT
194 u64 waittime_stamp;
195 u64 holdtime_stamp;
196#endif
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700197 /*
198 * The lock-stack is unified in that the lock chains of interrupt
199 * contexts nest ontop of process context chains, but we 'separate'
200 * the hashes by starting with 0 if we cross into an interrupt
201 * context, and we also keep do not add cross-context lock
202 * dependencies - the lock usage graph walking covers that area
203 * anyway, and we'd just unnecessarily increase the number of
204 * dependencies otherwise. [Note: hardirq and softirq contexts
205 * are separated from each other too.]
206 *
207 * The following field is used to detect when we cross into an
208 * interrupt context:
209 */
210 int irq_context;
211 int trylock;
212 int read;
213 int check;
214 int hardirqs_off;
215};
216
217/*
218 * Initialization, self-test and debugging-output methods:
219 */
220extern void lockdep_init(void);
221extern void lockdep_info(void);
222extern void lockdep_reset(void);
223extern void lockdep_reset_lock(struct lockdep_map *lock);
224extern void lockdep_free_key_range(void *start, unsigned long size);
225
226extern void lockdep_off(void);
227extern void lockdep_on(void);
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700228
229/*
230 * These methods are used by specific locking variants (spinlocks,
231 * rwlocks, mutexes and rwsems) to pass init/acquire/release events
232 * to lockdep:
233 */
234
235extern void lockdep_init_map(struct lockdep_map *lock, const char *name,
Peter Zijlstra4dfbb9d2006-10-11 01:45:14 -0400236 struct lock_class_key *key, int subclass);
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700237
238/*
239 * Reinitialize a lock key - for cases where there is special locking or
240 * special initialization of locks so that the validator gets the scope
241 * of dependencies wrong: they are either too broad (they need a class-split)
242 * or they are too narrow (they suffer from a false class-split):
243 */
244#define lockdep_set_class(lock, key) \
Peter Zijlstra4dfbb9d2006-10-11 01:45:14 -0400245 lockdep_init_map(&(lock)->dep_map, #key, key, 0)
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700246#define lockdep_set_class_and_name(lock, key, name) \
Peter Zijlstra4dfbb9d2006-10-11 01:45:14 -0400247 lockdep_init_map(&(lock)->dep_map, name, key, 0)
248#define lockdep_set_class_and_subclass(lock, key, sub) \
249 lockdep_init_map(&(lock)->dep_map, #key, key, sub)
250#define lockdep_set_subclass(lock, sub) \
251 lockdep_init_map(&(lock)->dep_map, #lock, \
252 (lock)->dep_map.key, sub)
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700253
254/*
255 * Acquire a lock.
256 *
257 * Values for "read":
258 *
259 * 0: exclusive (write) acquire
260 * 1: read-acquire (no recursion allowed)
261 * 2: read-acquire with same-instance recursion allowed
262 *
263 * Values for check:
264 *
265 * 0: disabled
266 * 1: simple checks (freeing, held-at-exit-time, etc.)
267 * 2: full validation
268 */
269extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
270 int trylock, int read, int check, unsigned long ip);
271
272extern void lock_release(struct lockdep_map *lock, int nested,
273 unsigned long ip);
274
275# define INIT_LOCKDEP .lockdep_recursion = 0,
276
Jarek Poplawskie3a55fd2007-03-22 00:11:26 -0800277#define lockdep_depth(tsk) (debug_locks ? (tsk)->lockdep_depth : 0)
Peter Zijlstrad5abe662006-12-06 20:37:26 -0800278
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700279#else /* !LOCKDEP */
280
281static inline void lockdep_off(void)
282{
283}
284
285static inline void lockdep_on(void)
286{
287}
288
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700289# define lock_acquire(l, s, t, r, c, i) do { } while (0)
290# define lock_release(l, n, i) do { } while (0)
291# define lockdep_init() do { } while (0)
292# define lockdep_info() do { } while (0)
Peter Zijlstra4dfbb9d2006-10-11 01:45:14 -0400293# define lockdep_init_map(lock, name, key, sub) do { (void)(key); } while (0)
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700294# define lockdep_set_class(lock, key) do { (void)(key); } while (0)
295# define lockdep_set_class_and_name(lock, key, name) \
296 do { (void)(key); } while (0)
Peter Zijlstra4dfbb9d2006-10-11 01:45:14 -0400297#define lockdep_set_class_and_subclass(lock, key, sub) \
298 do { (void)(key); } while (0)
Andrew Morton07646e22006-10-11 23:45:23 -0400299#define lockdep_set_subclass(lock, sub) do { } while (0)
300
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700301# define INIT_LOCKDEP
302# define lockdep_reset() do { debug_locks = 1; } while (0)
303# define lockdep_free_key_range(start, size) do { } while (0)
304/*
305 * The class key takes no space if lockdep is disabled:
306 */
307struct lock_class_key { };
Peter Zijlstrad5abe662006-12-06 20:37:26 -0800308
309#define lockdep_depth(tsk) (0)
310
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700311#endif /* !LOCKDEP */
312
Peter Zijlstraf20786f2007-07-19 01:48:56 -0700313#ifdef CONFIG_LOCK_STAT
314
315extern void lock_contended(struct lockdep_map *lock, unsigned long ip);
316extern void lock_acquired(struct lockdep_map *lock);
317
318#define LOCK_CONTENDED(_lock, try, lock) \
319do { \
320 if (!try(_lock)) { \
321 lock_contended(&(_lock)->dep_map, _RET_IP_); \
322 lock(_lock); \
323 lock_acquired(&(_lock)->dep_map); \
324 } \
325} while (0)
326
327#else /* CONFIG_LOCK_STAT */
328
329#define lock_contended(lockdep_map, ip) do {} while (0)
330#define lock_acquired(lockdep_map) do {} while (0)
331
332#define LOCK_CONTENDED(_lock, try, lock) \
333 lock(_lock)
334
335#endif /* CONFIG_LOCK_STAT */
336
Ingo Molnar243c7622006-07-03 00:25:06 -0700337#if defined(CONFIG_TRACE_IRQFLAGS) && defined(CONFIG_GENERIC_HARDIRQS)
338extern void early_init_irq_lock_class(void);
339#else
Ingo Molnar3117df02006-12-13 00:34:43 -0800340static inline void early_init_irq_lock_class(void)
341{
342}
Ingo Molnar243c7622006-07-03 00:25:06 -0700343#endif
344
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700345#ifdef CONFIG_TRACE_IRQFLAGS
346extern void early_boot_irqs_off(void);
347extern void early_boot_irqs_on(void);
Ingo Molnar3117df02006-12-13 00:34:43 -0800348extern void print_irqtrace_events(struct task_struct *curr);
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700349#else
Ingo Molnar3117df02006-12-13 00:34:43 -0800350static inline void early_boot_irqs_off(void)
351{
352}
353static inline void early_boot_irqs_on(void)
354{
355}
356static inline void print_irqtrace_events(struct task_struct *curr)
357{
358}
Ingo Molnarfbb9ce952006-07-03 00:24:50 -0700359#endif
360
361/*
362 * For trivial one-depth nesting of a lock-class, the following
363 * global define can be used. (Subsystems with multiple levels
364 * of nesting should define their own lock-nesting subclasses.)
365 */
366#define SINGLE_DEPTH_NESTING 1
367
368/*
369 * Map the dependency ops to NOP or to real lockdep ops, depending
370 * on the per lock-class debug mode:
371 */
372
373#ifdef CONFIG_DEBUG_LOCK_ALLOC
374# ifdef CONFIG_PROVE_LOCKING
375# define spin_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, i)
376# else
377# define spin_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, i)
378# endif
379# define spin_release(l, n, i) lock_release(l, n, i)
380#else
381# define spin_acquire(l, s, t, i) do { } while (0)
382# define spin_release(l, n, i) do { } while (0)
383#endif
384
385#ifdef CONFIG_DEBUG_LOCK_ALLOC
386# ifdef CONFIG_PROVE_LOCKING
387# define rwlock_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, i)
388# define rwlock_acquire_read(l, s, t, i) lock_acquire(l, s, t, 2, 2, i)
389# else
390# define rwlock_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, i)
391# define rwlock_acquire_read(l, s, t, i) lock_acquire(l, s, t, 2, 1, i)
392# endif
393# define rwlock_release(l, n, i) lock_release(l, n, i)
394#else
395# define rwlock_acquire(l, s, t, i) do { } while (0)
396# define rwlock_acquire_read(l, s, t, i) do { } while (0)
397# define rwlock_release(l, n, i) do { } while (0)
398#endif
399
400#ifdef CONFIG_DEBUG_LOCK_ALLOC
401# ifdef CONFIG_PROVE_LOCKING
402# define mutex_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, i)
403# else
404# define mutex_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, i)
405# endif
406# define mutex_release(l, n, i) lock_release(l, n, i)
407#else
408# define mutex_acquire(l, s, t, i) do { } while (0)
409# define mutex_release(l, n, i) do { } while (0)
410#endif
411
412#ifdef CONFIG_DEBUG_LOCK_ALLOC
413# ifdef CONFIG_PROVE_LOCKING
414# define rwsem_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, i)
415# define rwsem_acquire_read(l, s, t, i) lock_acquire(l, s, t, 1, 2, i)
416# else
417# define rwsem_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, i)
418# define rwsem_acquire_read(l, s, t, i) lock_acquire(l, s, t, 1, 1, i)
419# endif
420# define rwsem_release(l, n, i) lock_release(l, n, i)
421#else
422# define rwsem_acquire(l, s, t, i) do { } while (0)
423# define rwsem_acquire_read(l, s, t, i) do { } while (0)
424# define rwsem_release(l, n, i) do { } while (0)
425#endif
426
427#endif /* __LINUX_LOCKDEP_H */