[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v11 06/11] xen: Introduce XEN_DOMCTL_soft_reset
New domctl resets state for a domain allowing it to 'start over': register vcpu_info, switch to FIFO ABI for event channels. Still active grants are being logged to help debugging misbehaving backends. Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> Acked-by: Jan Beulich <jbeulich@xxxxxxxx> --- Changes since v10: - return when evtchn_reset() fails [Konrad Rzeszutek Wilk, Jan Beulich]. --- xen/common/domain.c | 49 +++++++++++++++++++++++++++++++++++++-------- xen/common/domctl.c | 9 +++++++++ xen/include/public/domctl.h | 1 + xen/include/xen/sched.h | 2 ++ 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/xen/common/domain.c b/xen/common/domain.c index 1b9fcfc..42c8caf 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -110,6 +110,16 @@ static void vcpu_check_shutdown(struct vcpu *v) spin_unlock(&d->shutdown_lock); } +static void vcpu_info_reset(struct vcpu *v) +{ + struct domain *d = v->domain; + + v->vcpu_info = ((v->vcpu_id < XEN_LEGACY_MAX_VCPUS) + ? (vcpu_info_t *)&shared_info(d, vcpu_info[v->vcpu_id]) + : &dummy_vcpu_info); + v->vcpu_info_mfn = INVALID_MFN; +} + struct vcpu *alloc_vcpu( struct domain *d, unsigned int vcpu_id, unsigned int cpu_id) { @@ -145,10 +155,7 @@ struct vcpu *alloc_vcpu( v->runstate.state = RUNSTATE_offline; v->runstate.state_entry_time = NOW(); set_bit(_VPF_down, &v->pause_flags); - v->vcpu_info = ((vcpu_id < XEN_LEGACY_MAX_VCPUS) - ? (vcpu_info_t *)&shared_info(d, vcpu_info[vcpu_id]) - : &dummy_vcpu_info); - v->vcpu_info_mfn = INVALID_MFN; + vcpu_info_reset(v); init_waitqueue_vcpu(v); } @@ -1038,6 +1045,34 @@ void domain_unpause_except_self(struct domain *d) domain_unpause(d); } +int domain_soft_reset(struct domain *d) +{ + struct vcpu *v; + int rc; + + spin_lock(&d->shutdown_lock); + for_each_vcpu ( d, v ) + if ( !v->paused_for_shutdown ) + { + spin_unlock(&d->shutdown_lock); + return -EINVAL; + } + spin_unlock(&d->shutdown_lock); + + rc = evtchn_reset(d); + if ( rc ) + return rc; + + grant_table_warn_active_grants(d); + + for_each_vcpu ( d, v ) + unmap_vcpu_info(v); + + domain_resume(d); + + return 0; +} + int vcpu_reset(struct vcpu *v) { struct domain *d = v->domain; @@ -1149,8 +1184,7 @@ int map_vcpu_info(struct vcpu *v, unsigned long gfn, unsigned offset) /* * Unmap the vcpu info page if the guest decided to place it somewhere - * else. This is only used from arch_domain_destroy, so there's no - * need to do anything clever. + * else. This is used from arch_domain_destroy and domain_soft_reset. */ void unmap_vcpu_info(struct vcpu *v) { @@ -1163,8 +1197,7 @@ void unmap_vcpu_info(struct vcpu *v) unmap_domain_page_global((void *) ((unsigned long)v->vcpu_info & PAGE_MASK)); - v->vcpu_info = &dummy_vcpu_info; - v->vcpu_info_mfn = INVALID_MFN; + vcpu_info_reset(v); put_page_and_type(mfn_to_page(mfn)); } diff --git a/xen/common/domctl.c b/xen/common/domctl.c index 7f959f3..41891b1 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -704,6 +704,15 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) break; } + case XEN_DOMCTL_soft_reset: + if ( d == current->domain ) + { + ret = -EINVAL; + break; + } + ret = domain_soft_reset(d); + break; + case XEN_DOMCTL_destroydomain: ret = domain_kill(d); if ( ret == -ERESTART ) diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 675f021..794d4d5 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -1139,6 +1139,7 @@ struct xen_domctl { #define XEN_DOMCTL_psr_cmt_op 75 #define XEN_DOMCTL_monitor_op 77 #define XEN_DOMCTL_psr_cat_op 78 +#define XEN_DOMCTL_soft_reset 79 #define XEN_DOMCTL_gdbsx_guestmemio 1000 #define XEN_DOMCTL_gdbsx_pausevcpu 1001 #define XEN_DOMCTL_gdbsx_unpausevcpu 1002 diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 73d3bc8..8053b5a 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -610,6 +610,8 @@ void domain_shutdown(struct domain *d, u8 reason); void domain_resume(struct domain *d); void domain_pause_for_debugger(void); +int domain_soft_reset(struct domain *d); + int vcpu_start_shutdown_deferral(struct vcpu *v); void vcpu_end_shutdown_deferral(struct vcpu *v); -- 2.4.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |