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) |
