aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/rcupdate.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2011-01-14 14:16:42 +0000
committerKeir Fraser <keir@xen.org>2011-01-14 14:16:42 +0000
commit24273c92be16bab4d48561a0d892463a544b0a4a (patch)
tree962bc5ca5f9dd81afb078396151d68736331d754 /xen/common/rcupdate.c
parent28c7ad54f50ec385f5ae6f5323801e8c0dd8b2cf (diff)
downloadxen-24273c92be16bab4d48561a0d892463a544b0a4a.tar.gz
xen-24273c92be16bab4d48561a0d892463a544b0a4a.tar.bz2
xen-24273c92be16bab4d48561a0d892463a544b0a4a.zip
rcupdate: Implement rcu_barrier() to synchronously flush RCU work.
Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/common/rcupdate.c')
-rw-r--r--xen/common/rcupdate.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/xen/common/rcupdate.c b/xen/common/rcupdate.c
index b93c1db697..9087a56d9c 100644
--- a/xen/common/rcupdate.c
+++ b/xen/common/rcupdate.c
@@ -44,6 +44,7 @@
#include <xen/percpu.h>
#include <xen/softirq.h>
#include <xen/cpu.h>
+#include <xen/stop_machine.h>
/* 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)
{