[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v10 06/11] xen: Introduce XEN_DOMCTL_soft_reset
On Tue, Jul 28, 2015 at 03:28:11PM +0200, Vitaly Kuznetsov wrote: > 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 v9: > - Unlock shutdown_lock on !v->paused_for_shutdown check failure > [Konrad Rzeszutek Wilk] > - Add Acked-by: [Jan Beulich] > --- > xen/common/domain.c | 47 > +++++++++++++++++++++++++++++++++++++-------- > xen/common/domctl.c | 9 +++++++++ > xen/include/public/domctl.h | 1 + > xen/include/xen/sched.h | 2 ++ > 4 files changed, 51 insertions(+), 8 deletions(-) > > diff --git a/xen/common/domain.c b/xen/common/domain.c > index 1b9fcfc..4c8e6a2 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,32 @@ 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); You do ignore the 'rc' value? In which case why not just do: (void)evtchn_reset(d); Unless you want to return the '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 +1182,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 +1195,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 |