From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vitaly Kuznetsov Subject: [PATCH v9 06/11] xen: Introduce XEN_DOMCTL_soft_reset Date: Thu, 16 Jul 2015 18:27:21 +0200 Message-ID: <1437064046-12174-7-git-send-email-vkuznets@redhat.com> References: <1437064046-12174-1-git-send-email-vkuznets@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1ZFm0q-0004Yp-3A for xen-devel@lists.xenproject.org; Thu, 16 Jul 2015 16:27:56 +0000 In-Reply-To: <1437064046-12174-1-git-send-email-vkuznets@redhat.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xenproject.org Cc: Andrew Jones , Julien Grall , Keir Fraser , Ian Campbell , Stefano Stabellini , Andrew Cooper , Ian Jackson , Olaf Hering , Tim Deegan , David Vrabel , Jan Beulich , Wei Liu , Daniel De Graaf List-Id: xen-devel@lists.xenproject.org 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 --- Changes since v8: - Introduce vcpu_info_reset() helper. [Konrad Rzeszutek Wilk] - Take shutdown_lock while checking v->paused_for_shutdown in domain_soft_reset() [Konrad Rzeszutek Wilk] --- xen/common/domain.c | 44 ++++++++++++++++++++++++++++++++++++-------- xen/common/domctl.c | 9 +++++++++ xen/include/public/domctl.h | 1 + xen/include/xen/sched.h | 2 ++ 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/xen/common/domain.c b/xen/common/domain.c index 8efef5c..4f805d5 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); } @@ -1010,6 +1017,29 @@ int domain_unpause_by_systemcontroller(struct domain *d) return 0; } +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 ) + return -EINVAL; + spin_unlock(&d->shutdown_lock); + + rc = evtchn_reset(d); + + 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; @@ -1121,8 +1151,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) { @@ -1135,8 +1164,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 8b1d6b4..93e85cf 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -1130,6 +1130,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 b29d9e7..18d8b57 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