diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2009-10-14 13:15:56 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-10-15 05:17:17 -0400 |
commit | 019129d595caaa5bd0b41d128308da1be6a91869 (patch) | |
tree | 2db09ada99b0b8ca0a6423626fa85a9c1a7fc141 | |
parent | 37c72e56f6b234ea7387ba530434a80abf2658d8 (diff) |
rcu: Stopgap fix for synchronize_rcu_expedited() for TREE_PREEMPT_RCU
For the short term, map synchronize_rcu_expedited() to
synchronize_rcu() for TREE_PREEMPT_RCU and to
synchronize_sched_expedited() for TREE_RCU.
Longer term, there needs to be a real expedited grace period for
TREE_PREEMPT_RCU, but candidate patches to date are considerably
more complex and intrusive.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: mathieu.desnoyers@polymtl.ca
Cc: josh@joshtriplett.org
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
Cc: Valdis.Kletnieks@vt.edu
Cc: dhowells@redhat.com
Cc: npiggin@suse.de
Cc: jens.axboe@oracle.com
LKML-Reference: <12555405592331-git-send-email->
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | include/linux/rcutree.h | 6 | ||||
-rw-r--r-- | kernel/rcutree_plugin.h | 21 |
2 files changed, 22 insertions, 5 deletions
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index 46e9ab3ee6e1..9642c6bcb399 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h | |||
@@ -76,11 +76,7 @@ static inline void __rcu_read_unlock_bh(void) | |||
76 | 76 | ||
77 | extern void call_rcu_sched(struct rcu_head *head, | 77 | extern void call_rcu_sched(struct rcu_head *head, |
78 | void (*func)(struct rcu_head *rcu)); | 78 | void (*func)(struct rcu_head *rcu)); |
79 | 79 | extern void synchronize_rcu_expedited(void); | |
80 | static inline void synchronize_rcu_expedited(void) | ||
81 | { | ||
82 | synchronize_sched_expedited(); | ||
83 | } | ||
84 | 80 | ||
85 | static inline void synchronize_rcu_bh_expedited(void) | 81 | static inline void synchronize_rcu_bh_expedited(void) |
86 | { | 82 | { |
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index c0cb783aa16a..ebd20ee7707d 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
@@ -393,6 +393,17 @@ void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | |||
393 | EXPORT_SYMBOL_GPL(call_rcu); | 393 | EXPORT_SYMBOL_GPL(call_rcu); |
394 | 394 | ||
395 | /* | 395 | /* |
396 | * Wait for an rcu-preempt grace period. We are supposed to expedite the | ||
397 | * grace period, but this is the crude slow compatability hack, so just | ||
398 | * invoke synchronize_rcu(). | ||
399 | */ | ||
400 | void synchronize_rcu_expedited(void) | ||
401 | { | ||
402 | synchronize_rcu(); | ||
403 | } | ||
404 | EXPORT_SYMBOL_GPL(synchronize_rcu_expedited); | ||
405 | |||
406 | /* | ||
396 | * Check to see if there is any immediate preemptable-RCU-related work | 407 | * Check to see if there is any immediate preemptable-RCU-related work |
397 | * to be done. | 408 | * to be done. |
398 | */ | 409 | */ |
@@ -565,6 +576,16 @@ void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) | |||
565 | EXPORT_SYMBOL_GPL(call_rcu); | 576 | EXPORT_SYMBOL_GPL(call_rcu); |
566 | 577 | ||
567 | /* | 578 | /* |
579 | * Wait for an rcu-preempt grace period, but make it happen quickly. | ||
580 | * But because preemptable RCU does not exist, map to rcu-sched. | ||
581 | */ | ||
582 | void synchronize_rcu_expedited(void) | ||
583 | { | ||
584 | synchronize_sched_expedited(); | ||
585 | } | ||
586 | EXPORT_SYMBOL_GPL(synchronize_rcu_expedited); | ||
587 | |||
588 | /* | ||
568 | * Because preemptable RCU does not exist, it never has any work to do. | 589 | * Because preemptable RCU does not exist, it never has any work to do. |
569 | */ | 590 | */ |
570 | static int rcu_preempt_pending(int cpu) | 591 | static int rcu_preempt_pending(int cpu) |