diff options
Diffstat (limited to 'kernel/rcupdate.c')
| -rw-r--r-- | kernel/rcupdate.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index a86f1741cc27..95cba41ce1e9 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
| @@ -51,6 +51,34 @@ | |||
| 51 | 51 | ||
| 52 | #include "rcu.h" | 52 | #include "rcu.h" |
| 53 | 53 | ||
| 54 | #ifdef CONFIG_PREEMPT_RCU | ||
| 55 | |||
| 56 | /* | ||
| 57 | * Check for a task exiting while in a preemptible-RCU read-side | ||
| 58 | * critical section, clean up if so. No need to issue warnings, | ||
| 59 | * as debug_check_no_locks_held() already does this if lockdep | ||
| 60 | * is enabled. | ||
| 61 | */ | ||
| 62 | void exit_rcu(void) | ||
| 63 | { | ||
| 64 | struct task_struct *t = current; | ||
| 65 | |||
| 66 | if (likely(list_empty(¤t->rcu_node_entry))) | ||
| 67 | return; | ||
| 68 | t->rcu_read_lock_nesting = 1; | ||
| 69 | barrier(); | ||
| 70 | t->rcu_read_unlock_special = RCU_READ_UNLOCK_BLOCKED; | ||
| 71 | __rcu_read_unlock(); | ||
| 72 | } | ||
| 73 | |||
| 74 | #else /* #ifdef CONFIG_PREEMPT_RCU */ | ||
| 75 | |||
| 76 | void exit_rcu(void) | ||
| 77 | { | ||
| 78 | } | ||
| 79 | |||
| 80 | #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ | ||
| 81 | |||
| 54 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 82 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 55 | static struct lock_class_key rcu_lock_key; | 83 | static struct lock_class_key rcu_lock_key; |
| 56 | struct lockdep_map rcu_lock_map = | 84 | struct lockdep_map rcu_lock_map = |
