[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Allow domains to set a shutdown code without actually shutting down
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1275640391 -3600 # Node ID 2dffb2585516a2ea0ca852d23cc0750e1c3f0f06 # Parent 4ab68bf4c37e4c97e12efe7aced616ce6946578f Allow domains to set a shutdown code without actually shutting down Useful for Windows guests, since the PV drivers are notified that the domain is about to crash just before the crash dump gets written. Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx> Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/common/domain.c | 14 ++++++++++---- xen/common/schedule.c | 21 +++++++++++++++++++++ xen/include/public/sched.h | 7 +++++++ xen/include/public/trace.h | 1 + 4 files changed, 39 insertions(+), 4 deletions(-) diff -r 4ab68bf4c37e -r 2dffb2585516 xen/common/domain.c --- a/xen/common/domain.c Thu Jun 03 07:30:54 2010 +0100 +++ b/xen/common/domain.c Fri Jun 04 09:33:11 2010 +0100 @@ -228,10 +228,12 @@ struct domain *domain_create( atomic_set(&d->refcnt, 1); spin_lock_init_prof(d, domain_lock); spin_lock_init_prof(d, page_alloc_lock); - spin_lock_init(&d->shutdown_lock); spin_lock_init(&d->hypercall_deadlock_mutex); INIT_PAGE_LIST_HEAD(&d->page_list); INIT_PAGE_LIST_HEAD(&d->xenpage_list); + + spin_lock_init(&d->shutdown_lock); + d->shutdown_code = -1; if ( domcr_flags & DOMCRF_hvm ) d->is_hvm = 1; @@ -485,11 +487,15 @@ void domain_shutdown(struct domain *d, u { struct vcpu *v; + spin_lock(&d->shutdown_lock); + + if ( d->shutdown_code == -1 ) + d->shutdown_code = reason; + reason = d->shutdown_code; + if ( d->domain_id == 0 ) dom0_shutdown(reason); - spin_lock(&d->shutdown_lock); - if ( d->is_shutting_down ) { spin_unlock(&d->shutdown_lock); @@ -497,7 +503,6 @@ void domain_shutdown(struct domain *d, u } d->is_shutting_down = 1; - d->shutdown_code = reason; smp_mb(); /* set shutdown status /then/ check for per-cpu deferrals */ @@ -529,6 +534,7 @@ void domain_resume(struct domain *d) spin_lock(&d->shutdown_lock); d->is_shutting_down = d->is_shut_down = 0; + d->shutdown_code = -1; for_each_vcpu ( d, v ) { diff -r 4ab68bf4c37e -r 2dffb2585516 xen/common/schedule.c --- a/xen/common/schedule.c Thu Jun 03 07:30:54 2010 +0100 +++ b/xen/common/schedule.c Fri Jun 04 09:33:11 2010 +0100 @@ -704,6 +704,27 @@ ret_t do_sched_op(int cmd, XEN_GUEST_HAN break; } + case SCHEDOP_shutdown_code: + { + struct sched_shutdown sched_shutdown; + struct domain *d = current->domain; + + ret = -EFAULT; + if ( copy_from_guest(&sched_shutdown, arg, 1) ) + break; + + TRACE_3D(TRC_SCHED_SHUTDOWN_CODE, + d->domain_id, current->vcpu_id, sched_shutdown.reason); + + spin_lock(&d->shutdown_lock); + if ( d->shutdown_code == -1 ) + d->shutdown_code = (u8)sched_shutdown.reason; + spin_unlock(&d->shutdown_lock); + + ret = 0; + break; + } + case SCHEDOP_poll: { struct sched_poll sched_poll; diff -r 4ab68bf4c37e -r 2dffb2585516 xen/include/public/sched.h --- a/xen/include/public/sched.h Thu Jun 03 07:30:54 2010 +0100 +++ b/xen/include/public/sched.h Fri Jun 04 09:33:11 2010 +0100 @@ -99,6 +99,13 @@ DEFINE_XEN_GUEST_HANDLE(sched_remote_shu DEFINE_XEN_GUEST_HANDLE(sched_remote_shutdown_t); /* + * Latch a shutdown code, so that when the domain later shuts down it + * reports this code to the control tools. + * @arg == as for SCHEDOP_shutdown. + */ +#define SCHEDOP_shutdown_code 5 + +/* * Reason codes for SCHEDOP_shutdown. These may be interpreted by control * software to determine the appropriate action. For the most part, Xen does * not care about the shutdown code. diff -r 4ab68bf4c37e -r 2dffb2585516 xen/include/public/trace.h --- a/xen/include/public/trace.h Thu Jun 03 07:30:54 2010 +0100 +++ b/xen/include/public/trace.h Fri Jun 04 09:33:11 2010 +0100 @@ -79,6 +79,7 @@ #define TRC_SCHED_DOM_TIMER_FN (TRC_SCHED_VERBOSE + 13) #define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED_VERBOSE + 14) #define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED_VERBOSE + 15) +#define TRC_SCHED_SHUTDOWN_CODE (TRC_SCHED_VERBOSE + 16) #define TRC_MEM_PAGE_GRANT_MAP (TRC_MEM + 1) #define TRC_MEM_PAGE_GRANT_UNMAP (TRC_MEM + 2) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |