diff options
author | Michal Marek <mmarek@suse.cz> | 2010-08-04 07:59:13 -0400 |
---|---|---|
committer | Michal Marek <mmarek@suse.cz> | 2010-08-04 07:59:13 -0400 |
commit | 772320e84588dcbe1600ffb83e5f328f2209ac2a (patch) | |
tree | a7de21b79340aeaa17c58126f6b801b82c77b53a /Documentation/RCU/lockdep.txt | |
parent | 1ce53adf13a54375d2a5c7cdbe341b2558389615 (diff) | |
parent | 9fe6206f400646a2322096b56c59891d530e8d51 (diff) |
Merge commit 'v2.6.35' into kbuild/kbuild
Conflicts:
arch/powerpc/Makefile
Diffstat (limited to 'Documentation/RCU/lockdep.txt')
-rw-r--r-- | Documentation/RCU/lockdep.txt | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/Documentation/RCU/lockdep.txt b/Documentation/RCU/lockdep.txt new file mode 100644 index 000000000000..d7a49b2f6994 --- /dev/null +++ b/Documentation/RCU/lockdep.txt | |||
@@ -0,0 +1,91 @@ | |||
1 | RCU and lockdep checking | ||
2 | |||
3 | All flavors of RCU have lockdep checking available, so that lockdep is | ||
4 | aware of when each task enters and leaves any flavor of RCU read-side | ||
5 | critical section. Each flavor of RCU is tracked separately (but note | ||
6 | that this is not the case in 2.6.32 and earlier). This allows lockdep's | ||
7 | tracking to include RCU state, which can sometimes help when debugging | ||
8 | deadlocks and the like. | ||
9 | |||
10 | In addition, RCU provides the following primitives that check lockdep's | ||
11 | state: | ||
12 | |||
13 | rcu_read_lock_held() for normal RCU. | ||
14 | rcu_read_lock_bh_held() for RCU-bh. | ||
15 | rcu_read_lock_sched_held() for RCU-sched. | ||
16 | srcu_read_lock_held() for SRCU. | ||
17 | |||
18 | These functions are conservative, and will therefore return 1 if they | ||
19 | aren't certain (for example, if CONFIG_DEBUG_LOCK_ALLOC is not set). | ||
20 | This prevents things like WARN_ON(!rcu_read_lock_held()) from giving false | ||
21 | positives when lockdep is disabled. | ||
22 | |||
23 | In addition, a separate kernel config parameter CONFIG_PROVE_RCU enables | ||
24 | checking of rcu_dereference() primitives: | ||
25 | |||
26 | rcu_dereference(p): | ||
27 | Check for RCU read-side critical section. | ||
28 | rcu_dereference_bh(p): | ||
29 | Check for RCU-bh read-side critical section. | ||
30 | rcu_dereference_sched(p): | ||
31 | Check for RCU-sched read-side critical section. | ||
32 | srcu_dereference(p, sp): | ||
33 | Check for SRCU read-side critical section. | ||
34 | rcu_dereference_check(p, c): | ||
35 | Use explicit check expression "c". This is useful in | ||
36 | code that is invoked by both readers and updaters. | ||
37 | rcu_dereference_raw(p) | ||
38 | Don't check. (Use sparingly, if at all.) | ||
39 | rcu_dereference_protected(p, c): | ||
40 | Use explicit check expression "c", and omit all barriers | ||
41 | and compiler constraints. This is useful when the data | ||
42 | structure cannot change, for example, in code that is | ||
43 | invoked only by updaters. | ||
44 | rcu_access_pointer(p): | ||
45 | Return the value of the pointer and omit all barriers, | ||
46 | but retain the compiler constraints that prevent duplicating | ||
47 | or coalescsing. This is useful when when testing the | ||
48 | value of the pointer itself, for example, against NULL. | ||
49 | |||
50 | The rcu_dereference_check() check expression can be any boolean | ||
51 | expression, but would normally include one of the rcu_read_lock_held() | ||
52 | family of functions and a lockdep expression. However, any boolean | ||
53 | expression can be used. For a moderately ornate example, consider | ||
54 | the following: | ||
55 | |||
56 | file = rcu_dereference_check(fdt->fd[fd], | ||
57 | rcu_read_lock_held() || | ||
58 | lockdep_is_held(&files->file_lock) || | ||
59 | atomic_read(&files->count) == 1); | ||
60 | |||
61 | This expression picks up the pointer "fdt->fd[fd]" in an RCU-safe manner, | ||
62 | and, if CONFIG_PROVE_RCU is configured, verifies that this expression | ||
63 | is used in: | ||
64 | |||
65 | 1. An RCU read-side critical section, or | ||
66 | 2. with files->file_lock held, or | ||
67 | 3. on an unshared files_struct. | ||
68 | |||
69 | In case (1), the pointer is picked up in an RCU-safe manner for vanilla | ||
70 | RCU read-side critical sections, in case (2) the ->file_lock prevents | ||
71 | any change from taking place, and finally, in case (3) the current task | ||
72 | is the only task accessing the file_struct, again preventing any change | ||
73 | from taking place. If the above statement was invoked only from updater | ||
74 | code, it could instead be written as follows: | ||
75 | |||
76 | file = rcu_dereference_protected(fdt->fd[fd], | ||
77 | lockdep_is_held(&files->file_lock) || | ||
78 | atomic_read(&files->count) == 1); | ||
79 | |||
80 | This would verify cases #2 and #3 above, and furthermore lockdep would | ||
81 | complain if this was used in an RCU read-side critical section unless one | ||
82 | of these two cases held. Because rcu_dereference_protected() omits all | ||
83 | barriers and compiler constraints, it generates better code than do the | ||
84 | other flavors of rcu_dereference(). On the other hand, it is illegal | ||
85 | to use rcu_dereference_protected() if either the RCU-protected pointer | ||
86 | or the RCU-protected data that it points to can change concurrently. | ||
87 | |||
88 | There are currently only "universal" versions of the rcu_assign_pointer() | ||
89 | and RCU list-/tree-traversal primitives, which do not (yet) check for | ||
90 | being in an RCU read-side critical section. In the future, separate | ||
91 | versions of these primitives might be created. | ||