From nobody Mon Feb 9 22:03:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=none dis=none) header.from=citrix.com ARC-Seal: i=1; a=rsa-sha256; t=1585236502; cv=none; d=zohomail.com; s=zohoarc; b=N3nfugmwAVFuRFzA5H/r8LIp5yb/RhXPwT4ti1ntcRQh5NHFne7dtz+3E2VCv2hCFbIUYtCFVW7gOpNjTMQgA14+MF9me3bAztVAW6KCtOU7rMOrBJogjCYRDXdkiG/sD3YmYkpuHhn5jFt4w2C0Q64hhRJYDVtf7FP7BJPeCh4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585236502; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=oFyR0rvvu79gkCDK7ezI2mCoc7NZpXenOJbhOtyR15M=; b=mxQZPFfqXB5FHSFtH+zVzNLaKWtc79zkFwM4wWANBvGOIHGIP9tR+ujHn84etwTqU1HcLhc+5Rj/nRWtJvdOkTqkrmWSu4WrY2Hz5rce0wU4nYDrjz/Q4H8aFxDkKYvUHvlmyU0ArXkkn1z0u6vU9b4FL9vbj8jVIDJi/BIwit8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1585236502550271.8468178846125; Thu, 26 Mar 2020 08:28:22 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1jHUQA-0006z2-5S; Thu, 26 Mar 2020 15:27:50 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1jHUQ9-0006yn-HJ for xen-devel@lists.xenproject.org; Thu, 26 Mar 2020 15:27:49 +0000 Received: from esa3.hc3370-68.iphmx.com (unknown [216.71.145.155]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 594b16dc-6f76-11ea-bec1-bc764e2007e4; Thu, 26 Mar 2020 15:27:48 +0000 (UTC) X-Inumbo-ID: 594b16dc-6f76-11ea-bec1-bc764e2007e4 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1585236469; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=E0RqJOy+iqFqrACfiFIQ7AC4O2Lse7qalLgxHINLqlw=; b=FY32rahqd6EVtOqVySAGxRNJNmq3izv7NgX7vSm9Ry5Cbst0i31DwkjW NAs/7H1VlX1xJ08UPu3+DztyjzJAftclrCF3Ipte7qz8wcwnsrsEYLxwj qfak8ohR9mXkLtZr0SQ7VODRY0Ko6EmrWSI9vj6ICWJ53Cq8we+hvCYF7 w=; Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=roger.pau@citrix.com; spf=Pass smtp.mailfrom=roger.pau@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of roger.pau@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa3.hc3370-68.iphmx.com: domain of roger.pau@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ip4:168.245.78.127 ~all" Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: l9hcf7M/Cq3JOnWpM026DH8B7pD/dLAb2utL2Vu/yY3b+JDxAQNNr7//THZ+UYThXQ19Q9sKio W4Z7qcprxaXYXP1bwkEuw9uZhU/zxcXVJnxhlaeLNKpFGAEZLSHcSn8kJBPqOkmZ/kWX3j02aw layhBhTU/+GlhE3ajDPcSAduS5JFt7r/QLQO5Zj40jzhnKaJF0eG4ooTaJdpcfTdSgD1Jk13KH RrN5SyTrSejBCHHxaMp5HZ1vXpb8mIxWG90gx1HgommLxqVGE9XpSmsMxJONUsAKFvfxvcftVs HLM= X-SBRS: 2.7 X-MesageID: 14677251 X-Ironport-Server: esa3.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.72,308,1580792400"; d="scan'208";a="14677251" From: Roger Pau Monne To: Date: Thu, 26 Mar 2020 16:27:19 +0100 Message-ID: <20200326152720.36970-4-roger.pau@citrix.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200326152720.36970-1-roger.pau@citrix.com> References: <20200326152720.36970-1-roger.pau@citrix.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Subject: [Xen-devel] [PATCH v3 3/4] x86/nvmx: split updating RVI from SVI in nvmx_update_apicv X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Kevin Tian , Jun Nakajima , Wei Liu , Andrew Cooper , Jan Beulich , Roger Pau Monne Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Updating SVI is required when an interrupt has been injected using the Ack on exit VMEXIT feature, so that the in service interrupt in the GUEST_INTR_STATUS matches the vector that is signaled in VM_EXIT_INTR_INFO. Updating RVI however is not tied to the Ack on exit feature, as it signals the next vector to be injected, and hence should always be updated to the next pending vector, regardless of whether Ack on exit is enabled. When not using the Ack on exit feature preserve the previous vector in SVI, so that it's not lost when RVI is updated to contain the pending vector to inject. Signed-off-by: Roger Pau Monn=C3=A9 Reviewed-by: Kevin Tian , with one small comment: --- Changes since v2: - Return early if the exit reason !=3D EXTERNAL_INTERRUPT. - Reduce the number of vmwrites by accumulating the changes to a local variable which is flushed at the end of the function. - Attempt to preserve the exiting SVI if Ack on exit is not enabled. --- xen/arch/x86/hvm/vmx/vvmx.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c index 1753005c91..39fb553590 100644 --- a/xen/arch/x86/hvm/vmx/vvmx.c +++ b/xen/arch/x86/hvm/vmx/vvmx.c @@ -1384,28 +1384,43 @@ static void nvmx_update_apicv(struct vcpu *v) struct nestedvmx *nvmx =3D &vcpu_2_nvmx(v); unsigned long reason =3D get_vvmcs(v, VM_EXIT_REASON); unsigned long intr_info =3D get_vvmcs(v, VM_EXIT_INTR_INFO); + unsigned long status; + int rvi; =20 - if ( reason =3D=3D EXIT_REASON_EXTERNAL_INTERRUPT && - nvmx->intr.source =3D=3D hvm_intsrc_lapic && + if ( reason !=3D EXIT_REASON_EXTERNAL_INTERRUPT ) + return; + + if ( nvmx->intr.source =3D=3D hvm_intsrc_lapic && (intr_info & INTR_INFO_VALID_MASK) ) { - uint16_t status; - uint32_t rvi, ppr; - uint32_t vector =3D intr_info & 0xff; + uint32_t ppr; + unsigned int vector =3D intr_info & INTR_INFO_VECTOR_MASK; struct vlapic *vlapic =3D vcpu_vlapic(v); =20 + /* + * Update SVI to record the current in service interrupt that's + * signaled in EXIT_INTR_INFO. + */ vlapic_ack_pending_irq(v, vector, 1); =20 ppr =3D vlapic_set_ppr(vlapic); WARN_ON((ppr & 0xf0) !=3D (vector & 0xf0)); =20 status =3D vector << VMX_GUEST_INTR_STATUS_SVI_OFFSET; - rvi =3D vlapic_has_pending_irq(v); - if ( rvi !=3D -1 ) - status |=3D rvi & VMX_GUEST_INTR_STATUS_SUBFIELD_BITMASK; + } + else + /* Keep previous SVI if there's any. */ + __vmread(GUEST_INTR_STATUS, &status); =20 - __vmwrite(GUEST_INTR_STATUS, status); + rvi =3D vlapic_has_pending_irq(v); + if ( rvi !=3D -1 ) + { + status &=3D ~VMX_GUEST_INTR_STATUS_SUBFIELD_BITMASK + status |=3D rvi & VMX_GUEST_INTR_STATUS_SUBFIELD_BITMASK; } + + if ( status ) + __vmwrite(GUEST_INTR_STATUS, status); } =20 static void virtual_vmexit(struct cpu_user_regs *regs) --=20 2.26.0