diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/rcu/rcu.h | 3 | ||||
| -rw-r--r-- | kernel/rcu/update.c | 5 |
2 files changed, 8 insertions, 0 deletions
diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h index 7859a0a3951e..a8f981a2d110 100644 --- a/kernel/rcu/rcu.h +++ b/kernel/rcu/rcu.h | |||
| @@ -102,13 +102,16 @@ static inline bool __rcu_reclaim(const char *rn, struct rcu_head *head) | |||
| 102 | { | 102 | { |
| 103 | unsigned long offset = (unsigned long)head->func; | 103 | unsigned long offset = (unsigned long)head->func; |
| 104 | 104 | ||
| 105 | rcu_lock_acquire(&rcu_callback_map); | ||
| 105 | if (__is_kfree_rcu_offset(offset)) { | 106 | if (__is_kfree_rcu_offset(offset)) { |
| 106 | RCU_TRACE(trace_rcu_invoke_kfree_callback(rn, head, offset)); | 107 | RCU_TRACE(trace_rcu_invoke_kfree_callback(rn, head, offset)); |
| 107 | kfree((void *)head - offset); | 108 | kfree((void *)head - offset); |
| 109 | rcu_lock_release(&rcu_callback_map); | ||
| 108 | return 1; | 110 | return 1; |
| 109 | } else { | 111 | } else { |
| 110 | RCU_TRACE(trace_rcu_invoke_callback(rn, head)); | 112 | RCU_TRACE(trace_rcu_invoke_callback(rn, head)); |
| 111 | head->func(head); | 113 | head->func(head); |
| 114 | rcu_lock_release(&rcu_callback_map); | ||
| 112 | return 0; | 115 | return 0; |
| 113 | } | 116 | } |
| 114 | } | 117 | } |
diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c index 6cb3dff89e2b..802365ccd591 100644 --- a/kernel/rcu/update.c +++ b/kernel/rcu/update.c | |||
| @@ -128,6 +128,11 @@ struct lockdep_map rcu_sched_lock_map = | |||
| 128 | STATIC_LOCKDEP_MAP_INIT("rcu_read_lock_sched", &rcu_sched_lock_key); | 128 | STATIC_LOCKDEP_MAP_INIT("rcu_read_lock_sched", &rcu_sched_lock_key); |
| 129 | EXPORT_SYMBOL_GPL(rcu_sched_lock_map); | 129 | EXPORT_SYMBOL_GPL(rcu_sched_lock_map); |
| 130 | 130 | ||
| 131 | static struct lock_class_key rcu_callback_key; | ||
| 132 | struct lockdep_map rcu_callback_map = | ||
| 133 | STATIC_LOCKDEP_MAP_INIT("rcu_callback", &rcu_callback_key); | ||
| 134 | EXPORT_SYMBOL_GPL(rcu_callback_map); | ||
| 135 | |||
| 131 | int notrace debug_lockdep_rcu_enabled(void) | 136 | int notrace debug_lockdep_rcu_enabled(void) |
| 132 | { | 137 | { |
| 133 | return rcu_scheduler_active && debug_locks && | 138 | return rcu_scheduler_active && debug_locks && |
