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