[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [XEN] Simplify domain shutdown -- no need to synchronously halt execution.



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxxx
# Node ID cf8e65797826dc86cab5ebfd735dd9823853e5c0
# Parent  5ec45b46456350f23e0aa4148bd52cbb64f1addf
[XEN] Simplify domain shutdown -- no need to synchronously halt execution.

This avoids a possible deadlock on the per-domain 'big lock'.

No control tools depend on synchronous halting of execution (e.g.,
save/restore already expect that secondary CPUs were halted
synchronously under the control of the guest itself). This makes the
code rather less complex.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/common/domain.c       |   55 +++-------------------------------------------
 xen/common/domctl.c       |    4 +--
 xen/include/xen/softirq.h |    5 +---
 3 files changed, 8 insertions(+), 56 deletions(-)

diff -r 5ec45b464563 -r cf8e65797826 xen/common/domain.c
--- a/xen/common/domain.c       Sat Nov 04 19:26:29 2006 +0000
+++ b/xen/common/domain.c       Sat Nov 04 19:50:59 2006 +0000
@@ -247,42 +247,6 @@ void __domain_crash_synchronous(void)
 }
 
 
-static DEFINE_PER_CPU(struct domain *, domain_shuttingdown);
-
-static void domain_shutdown_finalise(void)
-{
-    struct domain *d;
-    struct vcpu *v;
-
-    d = this_cpu(domain_shuttingdown);
-    this_cpu(domain_shuttingdown) = NULL;
-
-    BUG_ON(d == NULL);
-    BUG_ON(d == current->domain);
-
-    LOCK_BIGLOCK(d);
-
-    /* Make sure that every vcpu is descheduled before we finalise. */
-    for_each_vcpu ( d, v )
-        vcpu_sleep_sync(v);
-    BUG_ON(!cpus_empty(d->domain_dirty_cpumask));
-
-    /* Don't set DOMF_shutdown until execution contexts are sync'ed. */
-    if ( !test_and_set_bit(_DOMF_shutdown, &d->domain_flags) )
-        send_guest_global_virq(dom0, VIRQ_DOM_EXC);
-
-    UNLOCK_BIGLOCK(d);
-
-    put_domain(d);
-}
-
-static __init int domain_shutdown_finaliser_init(void)
-{
-    open_softirq(DOMAIN_SHUTDOWN_FINALISE_SOFTIRQ, domain_shutdown_finalise);
-    return 0;
-}
-__initcall(domain_shutdown_finaliser_init);
-
 void domain_shutdown(struct domain *d, u8 reason)
 {
     struct vcpu *v;
@@ -290,20 +254,13 @@ void domain_shutdown(struct domain *d, u
     if ( d->domain_id == 0 )
         dom0_shutdown(reason);
 
-    /* Mark the domain as shutting down. */
     d->shutdown_code = reason;
-
-    /* Put every vcpu to sleep, but don't wait (avoids inter-vcpu deadlock). */
-    spin_lock(&d->pause_lock);
-    d->pause_count++;
-    set_bit(_DOMF_paused, &d->domain_flags);
-    spin_unlock(&d->pause_lock);
+    set_bit(_DOMF_shutdown, &d->domain_flags);
+
     for_each_vcpu ( d, v )
         vcpu_sleep_nosync(v);
 
-    get_knownalive_domain(d);
-    this_cpu(domain_shuttingdown) = d;
-    raise_softirq(DOMAIN_SHUTDOWN_FINALISE_SOFTIRQ);
+    send_guest_global_virq(dom0, VIRQ_DOM_EXC);
 }
 
 
@@ -312,12 +269,8 @@ void domain_pause_for_debugger(void)
     struct domain *d = current->domain;
     struct vcpu *v;
 
-    /*
-     * NOTE: This does not synchronously pause the domain. The debugger
-     * must issue a PAUSEDOMAIN command to ensure that all execution
-     * has ceased and guest state is committed to memory.
-     */
     set_bit(_DOMF_ctrl_pause, &d->domain_flags);
+
     for_each_vcpu ( d, v )
         vcpu_sleep_nosync(v);
 
diff -r 5ec45b464563 -r cf8e65797826 xen/common/domctl.c
--- a/xen/common/domctl.c       Sat Nov 04 19:26:29 2006 +0000
+++ b/xen/common/domctl.c       Sat Nov 04 19:50:59 2006 +0000
@@ -107,9 +107,9 @@ void getdomaininfo(struct domain *d, str
             info->nr_online_vcpus++;
         }
     }
-    
+
     info->cpu_time = cpu_time;
-    
+
     info->flags = flags |
         ((d->domain_flags & DOMF_dying)      ? XEN_DOMINF_dying    : 0) |
         ((d->domain_flags & DOMF_shutdown)   ? XEN_DOMINF_shutdown : 0) |
diff -r 5ec45b464563 -r cf8e65797826 xen/include/xen/softirq.h
--- a/xen/include/xen/softirq.h Sat Nov 04 19:26:29 2006 +0000
+++ b/xen/include/xen/softirq.h Sat Nov 04 19:50:59 2006 +0000
@@ -8,9 +8,8 @@
 #define KEYPRESS_SOFTIRQ                  3
 #define NMI_SOFTIRQ                       4
 #define PAGE_SCRUB_SOFTIRQ                5
-#define DOMAIN_SHUTDOWN_FINALISE_SOFTIRQ  6
-#define TRACE_SOFTIRQ                     7
-#define NR_SOFTIRQS                       8
+#define TRACE_SOFTIRQ                     6
+#define NR_SOFTIRQS                       7
 
 #ifndef __ASSEMBLY__
 

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.