From nobody Mon Feb 9 15:11:10 2026 Delivered-To: importer@patchew.org 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; Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=quarantine dis=none) header.from=suse.com ARC-Seal: i=1; a=rsa-sha256; t=1613991457; cv=none; d=zohomail.com; s=zohoarc; b=S1ZSYAgbYlxd/aqGtw1MaI9PHycDRh7Kwr1Odpw0yjrOCmSc8JlcAdNNmEskyqtEpBZ47jsUER/Yr72UnHj24MEwafQO/BOdF1gVs4FZi995j9m4Z9jsCs7dr662ZRs8YCJeWczKtzOqRVs0TgOX6mPITCXCRNS7rfrYCC2e7r0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1613991457; 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=Qwwk9cXc8T/+fcdIQ8thR6iikFAxZizICApHFhBhDOw=; b=a+bHh5scMUqYurezTKHq39SCae8I77wkVkBKTpEPBacYYtskPvdn9sbjNnOUN4pjTPz05ZNBoYICo4p5i3qbLphysq4g+c2DMa1+u9c24uY+hSUKAN2RYvMwqxjbv6bavlB+x627498ILlfoKccaNLA2LFL8Z9peX2TE+beo0/U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=quarantine 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 1613991457371450.3184488727296; Mon, 22 Feb 2021 02:57:37 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.87930.165185 (Exim 4.92) (envelope-from ) id 1lE8u3-0004HM-Ai; Mon, 22 Feb 2021 10:57:23 +0000 Received: by outflank-mailman (output) from mailman id 87930.165185; Mon, 22 Feb 2021 10:57:23 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lE8u3-0004HF-7p; Mon, 22 Feb 2021 10:57:23 +0000 Received: by outflank-mailman (input) for mailman id 87930; Mon, 22 Feb 2021 10:57:22 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lE8u1-0004GV-Uy for xen-devel@lists.xenproject.org; Mon, 22 Feb 2021 10:57:21 +0000 Received: from mx2.suse.de (unknown [195.135.220.15]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 8a651254-2653-4f72-b939-40e592837b4c; Mon, 22 Feb 2021 10:57:20 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id AEEADAF21; Mon, 22 Feb 2021 10:57:19 +0000 (UTC) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 8a651254-2653-4f72-b939-40e592837b4c X-Virus-Scanned: by amavisd-new at test-mx.suse.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1613991439; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Qwwk9cXc8T/+fcdIQ8thR6iikFAxZizICApHFhBhDOw=; b=Aa8Rn3JV3/A++QN/tQ0BfOq7HlP0wKM43rw/+19LnVLknS9984ew0c13s+XKbMpmkPU+Gc lRIxWegqDVd8xxURcpwSCAY5vyrHMqAq2QbhC54iSPnyi4OKWlNLnHMxVbMzLlhLeQyDSH F6DRACguw8IiYKB7peSMPkuvicZUF1w= Subject: [PATCH v3 2/2] VMX: use a single, global APIC access page From: Jan Beulich To: "xen-devel@lists.xenproject.org" Cc: Andrew Cooper , Wei Liu , =?UTF-8?Q?Roger_Pau_Monn=c3=a9?= , Ian Jackson , George Dunlap , Kevin Tian , Jun Nakajima References: <4731a3a3-906a-98ac-11ba-6a0723903391@suse.com> Message-ID: <774a0bf2-d2a4-7dba-bf15-fec8b0ec8c5f@suse.com> Date: Mon, 22 Feb 2021 11:57:19 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: <4731a3a3-906a-98ac-11ba-6a0723903391@suse.com> Content-Language: en-US Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @suse.com) Content-Type: text/plain; charset="utf-8" The address of this page is used by the CPU only to recognize when to access the virtual APIC page instead. No accesses would ever go to this page. It only needs to be present in the (CPU) page tables so that address translation will produce its address as result for respective accesses. By making this page global, we also eliminate the need to refcount it, or to assign it to any domain in the first place. Signed-off-by: Jan Beulich Reviewed-by: Kevin Tian --- v3: Split p2m insertion change to a separate patch. v2: Avoid insertion when !has_vlapic(). Split off change to p2m_get_iommu_flags(). --- I did further consider not allocating any real page at all, but just using the address of some unpopulated space (which would require announcing this page as reserved to Dom0, so it wouldn't put any PCI MMIO BARs there). But I thought this would be too controversial, because of the possible risks associated with this. --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -66,8 +66,7 @@ boolean_param("force-ept", opt_force_ept static void vmx_ctxt_switch_from(struct vcpu *v); static void vmx_ctxt_switch_to(struct vcpu *v); =20 -static int vmx_alloc_vlapic_mapping(struct domain *d); -static void vmx_free_vlapic_mapping(struct domain *d); +static int alloc_vlapic_mapping(void); static void vmx_install_vlapic_mapping(struct vcpu *v); static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr, unsigned int flags); @@ -78,6 +77,8 @@ static int vmx_msr_read_intercept(unsign static int vmx_msr_write_intercept(unsigned int msr, uint64_t msr_content); static void vmx_invlpg(struct vcpu *v, unsigned long linear); =20 +static mfn_t __read_mostly apic_access_mfn; + /* Values for domain's ->arch.hvm_domain.pi_ops.flags. */ #define PI_CSW_FROM (1u << 0) #define PI_CSW_TO (1u << 1) @@ -401,7 +402,6 @@ static int vmx_domain_initialise(struct .to =3D vmx_ctxt_switch_to, .tail =3D vmx_do_resume, }; - int rc; =20 d->arch.ctxt_switch =3D &csw; =20 @@ -411,28 +411,14 @@ static int vmx_domain_initialise(struct */ d->arch.hvm.vmx.exec_sp =3D is_hardware_domain(d) || opt_ept_exec_sp; =20 - if ( !has_vlapic(d) ) - return 0; - - if ( (rc =3D vmx_alloc_vlapic_mapping(d)) !=3D 0 ) - return rc; - return 0; } =20 -static void vmx_domain_relinquish_resources(struct domain *d) -{ - if ( !has_vlapic(d) ) - return; - - vmx_free_vlapic_mapping(d); -} - static void domain_creation_finished(struct domain *d) { - if ( has_vlapic(d) && !mfn_eq(d->arch.hvm.vmx.apic_access_mfn, _mfn(0)= ) && + if ( has_vlapic(d) && !mfn_eq(apic_access_mfn, _mfn(0)) && set_mmio_p2m_entry(d, gaddr_to_gfn(APIC_DEFAULT_PHYS_BASE), - d->arch.hvm.vmx.apic_access_mfn, PAGE_ORDER_4K= ) ) + apic_access_mfn, PAGE_ORDER_4K) ) domain_crash(d); } =20 @@ -2415,7 +2401,6 @@ static struct hvm_function_table __initd .cpu_up_prepare =3D vmx_cpu_up_prepare, .cpu_dead =3D vmx_cpu_dead, .domain_initialise =3D vmx_domain_initialise, - .domain_relinquish_resources =3D vmx_domain_relinquish_resources, .domain_creation_finished =3D domain_creation_finished, .vcpu_initialise =3D vmx_vcpu_initialise, .vcpu_destroy =3D vmx_vcpu_destroy, @@ -2662,7 +2647,7 @@ const struct hvm_function_table * __init { set_in_cr4(X86_CR4_VMXE); =20 - if ( vmx_vmcs_init() ) + if ( vmx_vmcs_init() || alloc_vlapic_mapping() ) { printk("VMX: failed to initialise.\n"); return NULL; @@ -3217,7 +3202,7 @@ gp_fault: return X86EMUL_EXCEPTION; } =20 -static int vmx_alloc_vlapic_mapping(struct domain *d) +static int __init alloc_vlapic_mapping(void) { struct page_info *pg; mfn_t mfn; @@ -3225,52 +3210,28 @@ static int vmx_alloc_vlapic_mapping(stru if ( !cpu_has_vmx_virtualize_apic_accesses ) return 0; =20 - pg =3D alloc_domheap_page(d, MEMF_no_refcount); + pg =3D alloc_domheap_page(NULL, 0); if ( !pg ) return -ENOMEM; =20 - if ( !get_page_and_type(pg, d, PGT_writable_page) ) - { - /* - * The domain can't possibly know about this page yet, so failure - * here is a clear indication of something fishy going on. - */ - domain_crash(d); - return -ENODATA; - } - mfn =3D page_to_mfn(pg); clear_domain_page(mfn); - d->arch.hvm.vmx.apic_access_mfn =3D mfn; + apic_access_mfn =3D mfn; =20 return 0; } =20 -static void vmx_free_vlapic_mapping(struct domain *d) -{ - mfn_t mfn =3D d->arch.hvm.vmx.apic_access_mfn; - - d->arch.hvm.vmx.apic_access_mfn =3D _mfn(0); - if ( !mfn_eq(mfn, _mfn(0)) ) - { - struct page_info *pg =3D mfn_to_page(mfn); - - put_page_alloc_ref(pg); - put_page_and_type(pg); - } -} - static void vmx_install_vlapic_mapping(struct vcpu *v) { paddr_t virt_page_ma, apic_page_ma; =20 - if ( mfn_eq(v->domain->arch.hvm.vmx.apic_access_mfn, _mfn(0)) ) + if ( !has_vlapic(v->domain) || mfn_eq(apic_access_mfn, _mfn(0)) ) return; =20 ASSERT(cpu_has_vmx_virtualize_apic_accesses); =20 virt_page_ma =3D page_to_maddr(vcpu_vlapic(v)->regs_page); - apic_page_ma =3D mfn_to_maddr(v->domain->arch.hvm.vmx.apic_access_mfn); + apic_page_ma =3D mfn_to_maddr(apic_access_mfn); =20 vmx_vmcs_enter(v); __vmwrite(VIRTUAL_APIC_PAGE_ADDR, virt_page_ma); --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -58,7 +58,6 @@ struct ept_data { #define _VMX_DOMAIN_PML_ENABLED 0 #define VMX_DOMAIN_PML_ENABLED (1ul << _VMX_DOMAIN_PML_ENABLED) struct vmx_domain { - mfn_t apic_access_mfn; /* VMX_DOMAIN_* */ unsigned int status; =20