diff options
Diffstat (limited to 'kernel/rcupdate.c')
-rw-r--r-- | kernel/rcupdate.c | 20 |
1 files changed, 2 insertions, 18 deletions
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index c09605f8d16c..a4e329d92883 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
@@ -39,18 +39,12 @@ | |||
39 | #include <linux/sched.h> | 39 | #include <linux/sched.h> |
40 | #include <asm/atomic.h> | 40 | #include <asm/atomic.h> |
41 | #include <linux/bitops.h> | 41 | #include <linux/bitops.h> |
42 | #include <linux/completion.h> | ||
43 | #include <linux/percpu.h> | 42 | #include <linux/percpu.h> |
44 | #include <linux/notifier.h> | 43 | #include <linux/notifier.h> |
45 | #include <linux/cpu.h> | 44 | #include <linux/cpu.h> |
46 | #include <linux/mutex.h> | 45 | #include <linux/mutex.h> |
47 | #include <linux/module.h> | 46 | #include <linux/module.h> |
48 | 47 | ||
49 | struct rcu_synchronize { | ||
50 | struct rcu_head head; | ||
51 | struct completion completion; | ||
52 | }; | ||
53 | |||
54 | static DEFINE_PER_CPU(struct rcu_head, rcu_barrier_head) = {NULL}; | 48 | static DEFINE_PER_CPU(struct rcu_head, rcu_barrier_head) = {NULL}; |
55 | static atomic_t rcu_barrier_cpu_count; | 49 | static atomic_t rcu_barrier_cpu_count; |
56 | static DEFINE_MUTEX(rcu_barrier_mutex); | 50 | static DEFINE_MUTEX(rcu_barrier_mutex); |
@@ -60,7 +54,7 @@ static struct completion rcu_barrier_completion; | |||
60 | * Awaken the corresponding synchronize_rcu() instance now that a | 54 | * Awaken the corresponding synchronize_rcu() instance now that a |
61 | * grace period has elapsed. | 55 | * grace period has elapsed. |
62 | */ | 56 | */ |
63 | static void wakeme_after_rcu(struct rcu_head *head) | 57 | void wakeme_after_rcu(struct rcu_head *head) |
64 | { | 58 | { |
65 | struct rcu_synchronize *rcu; | 59 | struct rcu_synchronize *rcu; |
66 | 60 | ||
@@ -77,17 +71,7 @@ static void wakeme_after_rcu(struct rcu_head *head) | |||
77 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), | 71 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), |
78 | * and may be nested. | 72 | * and may be nested. |
79 | */ | 73 | */ |
80 | void synchronize_rcu(void) | 74 | synchronize_rcu_xxx(synchronize_rcu, call_rcu) |
81 | { | ||
82 | struct rcu_synchronize rcu; | ||
83 | |||
84 | init_completion(&rcu.completion); | ||
85 | /* Will wake me after RCU finished */ | ||
86 | call_rcu(&rcu.head, wakeme_after_rcu); | ||
87 | |||
88 | /* Wait for it */ | ||
89 | wait_for_completion(&rcu.completion); | ||
90 | } | ||
91 | EXPORT_SYMBOL_GPL(synchronize_rcu); | 75 | EXPORT_SYMBOL_GPL(synchronize_rcu); |
92 | 76 | ||
93 | static void rcu_barrier_callback(struct rcu_head *notused) | 77 | static void rcu_barrier_callback(struct rcu_head *notused) |