# HG changeset patch # User Keir Fraser # Date 1295014602 0 # Node ID bb0d0141ebf7f4ffec54c0c5775e964a41978a4c # Parent 2d4fe1a048cd8ae4c8aa0a50f65d0211c8ecf4d2 rcupdate: Implement rcu_barrier() to synchronously flush RCU work. Signed-off-by: Keir Fraser diff -r 2d4fe1a048cd -r bb0d0141ebf7 xen/common/rcupdate.c --- a/xen/common/rcupdate.c Fri Jan 14 14:16:04 2011 +0000 +++ b/xen/common/rcupdate.c Fri Jan 14 14:16:42 2011 +0000 @@ -44,6 +44,7 @@ #include #include #include +#include /* Definition for rcupdate control block. */ struct rcu_ctrlblk rcu_ctrlblk = { @@ -60,6 +61,30 @@ static int qhimark = 10000; static int qlowmark = 100; static int rsinterval = 1000; +static int rcu_barrier_action(void *unused) +{ + unsigned int cpu = smp_processor_id(); + + ASSERT(!local_irq_is_enabled()); + local_irq_enable(); + + while ( rcu_needs_cpu(cpu) ) + { + rcu_check_callbacks(cpu); + process_pending_softirqs(); + cpu_relax(); + } + + local_irq_disable(); + + return 0; +} + +int rcu_barrier(void) +{ + return stop_machine_run(rcu_barrier_action, NULL, NR_CPUS); +} + static void force_quiescent_state(struct rcu_data *rdp, struct rcu_ctrlblk *rcp) { diff -r 2d4fe1a048cd -r bb0d0141ebf7 xen/include/xen/rcupdate.h --- a/xen/include/xen/rcupdate.h Fri Jan 14 14:16:04 2011 +0000 +++ b/xen/include/xen/rcupdate.h Fri Jan 14 14:16:42 2011 +0000 @@ -197,4 +197,6 @@ void rcu_check_callbacks(int cpu); void fastcall call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *head)); +int rcu_barrier(void); + #endif /* __XEN_RCUPDATE_H */