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 /kernel/rcupdate.c | |
parent | 1ce53adf13a54375d2a5c7cdbe341b2558389615 (diff) | |
parent | 9fe6206f400646a2322096b56c59891d530e8d51 (diff) |
Merge commit 'v2.6.35' into kbuild/kbuild
Conflicts:
arch/powerpc/Makefile
Diffstat (limited to 'kernel/rcupdate.c')
-rw-r--r-- | kernel/rcupdate.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index 9b7fd4723878..72a8dc9567f5 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
@@ -44,14 +44,54 @@ | |||
44 | #include <linux/cpu.h> | 44 | #include <linux/cpu.h> |
45 | #include <linux/mutex.h> | 45 | #include <linux/mutex.h> |
46 | #include <linux/module.h> | 46 | #include <linux/module.h> |
47 | #include <linux/hardirq.h> | ||
47 | 48 | ||
48 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 49 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
49 | static struct lock_class_key rcu_lock_key; | 50 | static struct lock_class_key rcu_lock_key; |
50 | struct lockdep_map rcu_lock_map = | 51 | struct lockdep_map rcu_lock_map = |
51 | STATIC_LOCKDEP_MAP_INIT("rcu_read_lock", &rcu_lock_key); | 52 | STATIC_LOCKDEP_MAP_INIT("rcu_read_lock", &rcu_lock_key); |
52 | EXPORT_SYMBOL_GPL(rcu_lock_map); | 53 | EXPORT_SYMBOL_GPL(rcu_lock_map); |
54 | |||
55 | static struct lock_class_key rcu_bh_lock_key; | ||
56 | struct lockdep_map rcu_bh_lock_map = | ||
57 | STATIC_LOCKDEP_MAP_INIT("rcu_read_lock_bh", &rcu_bh_lock_key); | ||
58 | EXPORT_SYMBOL_GPL(rcu_bh_lock_map); | ||
59 | |||
60 | static struct lock_class_key rcu_sched_lock_key; | ||
61 | struct lockdep_map rcu_sched_lock_map = | ||
62 | STATIC_LOCKDEP_MAP_INIT("rcu_read_lock_sched", &rcu_sched_lock_key); | ||
63 | EXPORT_SYMBOL_GPL(rcu_sched_lock_map); | ||
53 | #endif | 64 | #endif |
54 | 65 | ||
66 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
67 | |||
68 | int debug_lockdep_rcu_enabled(void) | ||
69 | { | ||
70 | return rcu_scheduler_active && debug_locks && | ||
71 | current->lockdep_recursion == 0; | ||
72 | } | ||
73 | EXPORT_SYMBOL_GPL(debug_lockdep_rcu_enabled); | ||
74 | |||
75 | /** | ||
76 | * rcu_read_lock_bh_held - might we be in RCU-bh read-side critical section? | ||
77 | * | ||
78 | * Check for bottom half being disabled, which covers both the | ||
79 | * CONFIG_PROVE_RCU and not cases. Note that if someone uses | ||
80 | * rcu_read_lock_bh(), but then later enables BH, lockdep (if enabled) | ||
81 | * will show the situation. | ||
82 | * | ||
83 | * Check debug_lockdep_rcu_enabled() to prevent false positives during boot. | ||
84 | */ | ||
85 | int rcu_read_lock_bh_held(void) | ||
86 | { | ||
87 | if (!debug_lockdep_rcu_enabled()) | ||
88 | return 1; | ||
89 | return in_softirq(); | ||
90 | } | ||
91 | EXPORT_SYMBOL_GPL(rcu_read_lock_bh_held); | ||
92 | |||
93 | #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | ||
94 | |||
55 | /* | 95 | /* |
56 | * Awaken the corresponding synchronize_rcu() instance now that a | 96 | * Awaken the corresponding synchronize_rcu() instance now that a |
57 | * grace period has elapsed. | 97 | * grace period has elapsed. |
@@ -63,3 +103,14 @@ void wakeme_after_rcu(struct rcu_head *head) | |||
63 | rcu = container_of(head, struct rcu_synchronize, head); | 103 | rcu = container_of(head, struct rcu_synchronize, head); |
64 | complete(&rcu->completion); | 104 | complete(&rcu->completion); |
65 | } | 105 | } |
106 | |||
107 | #ifdef CONFIG_PROVE_RCU | ||
108 | /* | ||
109 | * wrapper function to avoid #include problems. | ||
110 | */ | ||
111 | int rcu_my_thread_group_empty(void) | ||
112 | { | ||
113 | return thread_group_empty(current); | ||
114 | } | ||
115 | EXPORT_SYMBOL_GPL(rcu_my_thread_group_empty); | ||
116 | #endif /* #ifdef CONFIG_PROVE_RCU */ | ||