From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Durrant Subject: [PATCH v6 01/16] x86/hvm: make sure emulation is retried if domain is shutting down Date: Fri, 3 Jul 2015 17:25:18 +0100 Message-ID: <1435940733-20856-2-git-send-email-paul.durrant@citrix.com> References: <1435940733-20856-1-git-send-email-paul.durrant@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1ZB3mV-0007HO-Pr for xen-devel@lists.xenproject.org; Fri, 03 Jul 2015 16:25:39 +0000 In-Reply-To: <1435940733-20856-1-git-send-email-paul.durrant@citrix.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: Paul Durrant , Keir Fraser , Jan Beulich List-Id: xen-devel@lists.xenproject.org The addition of commit 2df1aa01 "x86/hvm: remove hvm_io_pending() check in hvmemul_do_io()" causes a problem in migration because I/O that was caught by the test of vcpu_start_shutdown_deferral() in hvm_send_assist_req() is now considered completed rather than requiring a retry. This patch fixes the problem by having hvm_send_assist_req() return X86EMUL_RETRY rather than X86EMUL_OKAY if the vcpu_start_shutdown_deferral() test fails and then making sure that the emulation state is reset if the domain is found to be shutting down. Reported-by: Don Slutz Signed-off-by: Paul Durrant Cc: Keir Fraser Cc: Jan Beulich Reviewed-by: Andrew Cooper --- xen/arch/x86/hvm/emulate.c | 2 +- xen/arch/x86/hvm/hvm.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index fe5661d..8b60843 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -183,7 +183,7 @@ static int hvmemul_do_io( else { rc = hvm_send_assist_req(s, &p); - if ( rc != X86EMUL_RETRY ) + if ( rc != X86EMUL_RETRY || curr->domain->is_shutting_down ) vio->io_state = HVMIO_none; else if ( data_is_addr || dir == IOREQ_WRITE ) rc = X86EMUL_OKAY; diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 535d622..f0cf064 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -2613,7 +2613,7 @@ int hvm_send_assist_req(struct hvm_ioreq_server *s, ioreq_t *proto_p) ASSERT(s); if ( unlikely(!vcpu_start_shutdown_deferral(curr)) ) - return X86EMUL_OKAY; + return X86EMUL_RETRY; list_for_each_entry ( sv, &s->ioreq_vcpu_list, -- 1.7.10.4