diff options
Diffstat (limited to 'kernel/rcupdate.c')
| -rw-r--r-- | kernel/rcupdate.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index ddddb320be61..ca0d23b6b3e8 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
| @@ -46,6 +46,11 @@ | |||
| 46 | #include <linux/module.h> | 46 | #include <linux/module.h> |
| 47 | #include <linux/hardirq.h> | 47 | #include <linux/hardirq.h> |
| 48 | 48 | ||
| 49 | #define CREATE_TRACE_POINTS | ||
| 50 | #include <trace/events/rcu.h> | ||
| 51 | |||
| 52 | #include "rcu.h" | ||
| 53 | |||
| 49 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 54 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 50 | static struct lock_class_key rcu_lock_key; | 55 | static struct lock_class_key rcu_lock_key; |
| 51 | struct lockdep_map rcu_lock_map = | 56 | struct lockdep_map rcu_lock_map = |
| @@ -94,11 +99,16 @@ EXPORT_SYMBOL_GPL(rcu_read_lock_bh_held); | |||
| 94 | 99 | ||
| 95 | #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | 100 | #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ |
| 96 | 101 | ||
| 102 | struct rcu_synchronize { | ||
| 103 | struct rcu_head head; | ||
| 104 | struct completion completion; | ||
| 105 | }; | ||
| 106 | |||
| 97 | /* | 107 | /* |
| 98 | * Awaken the corresponding synchronize_rcu() instance now that a | 108 | * Awaken the corresponding synchronize_rcu() instance now that a |
| 99 | * grace period has elapsed. | 109 | * grace period has elapsed. |
| 100 | */ | 110 | */ |
| 101 | void wakeme_after_rcu(struct rcu_head *head) | 111 | static void wakeme_after_rcu(struct rcu_head *head) |
| 102 | { | 112 | { |
| 103 | struct rcu_synchronize *rcu; | 113 | struct rcu_synchronize *rcu; |
| 104 | 114 | ||
| @@ -106,6 +116,20 @@ void wakeme_after_rcu(struct rcu_head *head) | |||
| 106 | complete(&rcu->completion); | 116 | complete(&rcu->completion); |
| 107 | } | 117 | } |
| 108 | 118 | ||
| 119 | void wait_rcu_gp(call_rcu_func_t crf) | ||
| 120 | { | ||
| 121 | struct rcu_synchronize rcu; | ||
| 122 | |||
| 123 | init_rcu_head_on_stack(&rcu.head); | ||
| 124 | init_completion(&rcu.completion); | ||
| 125 | /* Will wake me after RCU finished. */ | ||
| 126 | crf(&rcu.head, wakeme_after_rcu); | ||
| 127 | /* Wait for it. */ | ||
| 128 | wait_for_completion(&rcu.completion); | ||
| 129 | destroy_rcu_head_on_stack(&rcu.head); | ||
| 130 | } | ||
| 131 | EXPORT_SYMBOL_GPL(wait_rcu_gp); | ||
| 132 | |||
| 109 | #ifdef CONFIG_PROVE_RCU | 133 | #ifdef CONFIG_PROVE_RCU |
| 110 | /* | 134 | /* |
| 111 | * wrapper function to avoid #include problems. | 135 | * wrapper function to avoid #include problems. |
