WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] stopmachine: Implement using tasklets rat

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] stopmachine: Implement using tasklets rather than a softirq.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 19 Apr 2010 18:50:26 -0700
Delivery-date: Mon, 19 Apr 2010 18:52:21 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1271674079 -3600
# Node ID f1313dd68da4077ccd4f5530a7bc79d649bdffab
# Parent  652e40d4dd8864a16084a1ff634d95f4a7260f20
stopmachine: Implement using tasklets rather than a softirq.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/ia64/xen/domain.c |    4 ++++
 xen/arch/x86/domain.c      |    5 +++++
 xen/common/stop_machine.c  |   19 +++++++++++--------
 xen/include/xen/sched.h    |    3 +++
 xen/include/xen/softirq.h  |    1 -
 5 files changed, 23 insertions(+), 9 deletions(-)

diff -r 652e40d4dd88 -r f1313dd68da4 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Mon Apr 19 11:34:49 2010 +0100
+++ b/xen/arch/ia64/xen/domain.c        Mon Apr 19 11:47:59 2010 +0100
@@ -2343,6 +2343,10 @@ void machine_halt(void)
        while(1);
 }
 
+void sync_local_execstate(void)
+{
+}
+
 void sync_vcpu_execstate(struct vcpu *v)
 {
 //     __ia64_save_fpu(v->arch._thread.fph);
diff -r 652e40d4dd88 -r f1313dd68da4 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Mon Apr 19 11:34:49 2010 +0100
+++ b/xen/arch/x86/domain.c     Mon Apr 19 11:47:59 2010 +0100
@@ -1509,6 +1509,11 @@ int __sync_lazy_execstate(void)
     return switch_required;
 }
 
+void sync_local_execstate(void)
+{
+    (void)__sync_lazy_execstate();
+}
+
 void sync_vcpu_execstate(struct vcpu *v)
 {
     if ( cpu_isset(smp_processor_id(), v->vcpu_dirty_cpumask) )
diff -r 652e40d4dd88 -r f1313dd68da4 xen/common/stop_machine.c
--- a/xen/common/stop_machine.c Mon Apr 19 11:34:49 2010 +0100
+++ b/xen/common/stop_machine.c Mon Apr 19 11:47:59 2010 +0100
@@ -24,7 +24,7 @@
 #include <xen/init.h>
 #include <xen/sched.h>
 #include <xen/spinlock.h>
-#include <xen/softirq.h>
+#include <xen/tasklet.h>
 #include <xen/stop_machine.h>
 #include <xen/errno.h>
 #include <xen/smp.h>
@@ -51,6 +51,7 @@ struct stopmachine_data {
     void *fn_data;
 };
 
+static DEFINE_PER_CPU(struct tasklet, stopmachine_tasklet);
 static struct stopmachine_data stopmachine_data;
 static DEFINE_SPINLOCK(stopmachine_lock);
 
@@ -81,10 +82,7 @@ int stop_machine_run(int (*fn)(void *), 
         return (*fn)(data);
     }
 
-    /* Note: We shouldn't spin on lock when it's held by others since others
-     * is expecting this cpus to enter softirq context. Or else deadlock
-     * is caused.
-     */
+    /* Must not spin here as the holder will expect us to be descheduled. */
     if ( !spin_trylock(&stopmachine_lock) )
         return -EBUSY;
 
@@ -98,8 +96,9 @@ int stop_machine_run(int (*fn)(void *), 
     smp_wmb();
 
     for_each_cpu_mask ( i, allbutself )
-        cpu_raise_softirq(i, STOPMACHINE_SOFTIRQ);
+        tasklet_schedule_on_cpu(&per_cpu(stopmachine_tasklet, i), i);
 
+    sync_local_execstate();
     stopmachine_set_state(STOPMACHINE_PREPARE);
 
     local_irq_disable();
@@ -118,10 +117,11 @@ int stop_machine_run(int (*fn)(void *), 
     return ret;
 }
 
-static void stopmachine_softirq(void)
+static void stopmachine_action(unsigned long unused)
 {
     enum stopmachine_state state = STOPMACHINE_START;
 
+    sync_local_execstate();
     smp_mb();
 
     while ( state != STOPMACHINE_EXIT )
@@ -153,7 +153,10 @@ static void stopmachine_softirq(void)
 
 static int __init cpu_stopmachine_init(void)
 {
-    open_softirq(STOPMACHINE_SOFTIRQ, stopmachine_softirq);
+    unsigned int cpu;
+    for_each_possible_cpu ( cpu )
+        tasklet_init(&per_cpu(stopmachine_tasklet, cpu),
+                     stopmachine_action, 0);
     return 0;
 }
 __initcall(cpu_stopmachine_init);
diff -r 652e40d4dd88 -r f1313dd68da4 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Mon Apr 19 11:34:49 2010 +0100
+++ b/xen/include/xen/sched.h   Mon Apr 19 11:47:59 2010 +0100
@@ -480,6 +480,9 @@ void vcpu_sleep_sync(struct vcpu *d);
  */
 void sync_vcpu_execstate(struct vcpu *v);
 
+/* As above, for any lazy state being held on the local CPU. */
+void sync_local_execstate(void);
+
 /*
  * Called by the scheduler to switch to another VCPU. This function must
  * call context_saved(@prev) when the local CPU is no longer running in
diff -r 652e40d4dd88 -r f1313dd68da4 xen/include/xen/softirq.h
--- a/xen/include/xen/softirq.h Mon Apr 19 11:34:49 2010 +0100
+++ b/xen/include/xen/softirq.h Mon Apr 19 11:47:59 2010 +0100
@@ -8,7 +8,6 @@ enum {
     NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ,
     PAGE_SCRUB_SOFTIRQ,
     RCU_SOFTIRQ,
-    STOPMACHINE_SOFTIRQ,
     NR_COMMON_SOFTIRQS
 };
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] stopmachine: Implement using tasklets rather than a softirq., Xen patchbot-unstable <=