From nobody Mon Feb 9 06:49:22 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 ARC-Seal: i=1; a=rsa-sha256; t=1619014574; cv=none; d=zohomail.com; s=zohoarc; b=aVsjlhpxc/AFziMW2ylnvJBZgCfjkR7Cfq8P/UpYSpxAYcHW6X9uys1zGLumKPAdAwUQjecbi4MnPIk8B2h5cUTIG6q4f+tH6momkUvN2lA4AkzKHW2cP9yhBP8m2wU83FhYphCHqA7aDHwudomE59BV8Zk2Z9lpbYVrDlx3VCE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619014574; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=ITwCFGJE5PzREULzlU52/zPUFXElzM0weVPpMgzvcOM=; b=dPW/3S46Pz3QqRPA+gtcpVYarWCg+y0TeNtSKeL8naDyFu/3ZY8KPEFn5LjhDTDw+DE+H4DXNn5N3UPU7Qxbmv8rMQTJcCsZsuAAwfCR1WuZoukHynxrLULHJm3YidwbwdAL9CPtBTWb4jKxtVckN/6DMxnb1un3x+4MFR4tzbI= 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 Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1619014574442326.3210411437227; Wed, 21 Apr 2021 07:16:14 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.114545.218347 (Exim 4.92) (envelope-from ) id 1lZDe3-0007uY-0O; Wed, 21 Apr 2021 14:15:59 +0000 Received: by outflank-mailman (output) from mailman id 114545.218347; Wed, 21 Apr 2021 14:15:58 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lZDe2-0007uN-RG; Wed, 21 Apr 2021 14:15:58 +0000 Received: by outflank-mailman (input) for mailman id 114545; Wed, 21 Apr 2021 14:15:56 +0000 Received: from mail.xenproject.org ([104.130.215.37]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lZDe0-0007qn-Ic for xen-devel@lists.xenproject.org; Wed, 21 Apr 2021 14:15:56 +0000 Received: from xenbits.xenproject.org ([104.239.192.120]) by mail.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lZDe0-0000xW-Fq; Wed, 21 Apr 2021 14:15:56 +0000 Received: from 54-240-197-235.amazon.com ([54.240.197.235] helo=ua82172827c7b5a.ant.amazon.com) by xenbits.xenproject.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lZDe0-00045m-5W; Wed, 21 Apr 2021 14:15:56 +0000 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" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=xen.org; s=20200302mail; h=References:In-Reply-To:References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From; bh=ITwCFGJE5PzREULzlU52/zPUFXElzM0weVPpMgzvcOM=; b=0 bzq9Ai+3RFDuCdJsQi6ptxhmoLKVT9+2a3cJ3gjqHHvez8sfWZMDVIXy97K0Be0ECxuq0FxZu+Lgo rlh8KN2liI5eVT+6FlvJkAwr/coNHtoXH2M7qaAIXhHQi1BRm5FkNVjSq1l8X31kPQhQdh+qDr3kP 0zC3OFv0jRLVOgao=; From: Hongyan Xia To: xen-devel@lists.xenproject.org Cc: jgrall@amazon.com, Jan Beulich , Andrew Cooper , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= , Wei Liu Subject: [PATCH v10 03/13] x86/mm: switch to new APIs in modify_xen_mappings Date: Wed, 21 Apr 2021 15:15:31 +0100 Message-Id: <8a15361c10f2cdcf2bd4a973d10c45be6a2536e3.1619014052.git.hongyxia@amazon.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: X-ZohoMail-DKIM: pass (identity @xen.org) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Wei Liu Page tables allocated in that function should be mapped and unmapped now. Note that pl2e now maybe mapped and unmapped in different iterations, so we need to add clean-ups for that. Signed-off-by: Wei Liu Signed-off-by: Hongyan Xia Reviewed-by: Jan Beulich --- Changed in v7: - use normal unmap in the error path. --- xen/arch/x86/mm.c | 57 ++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 8a68da26f45f..832e654294b4 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -5546,6 +5546,7 @@ int map_pages_to_xen( =20 out: L3T_UNLOCK(current_l3page); + unmap_domain_page(pl2e); unmap_domain_page(pl3e); unmap_domain_page(pl2e); return rc; @@ -5572,7 +5573,7 @@ int modify_xen_mappings(unsigned long s, unsigned lon= g e, unsigned int nf) { bool locking =3D system_state > SYS_STATE_boot; l3_pgentry_t *pl3e =3D NULL; - l2_pgentry_t *pl2e; + l2_pgentry_t *pl2e =3D NULL; l1_pgentry_t *pl1e; unsigned int i; unsigned long v =3D s; @@ -5592,6 +5593,7 @@ int modify_xen_mappings(unsigned long s, unsigned lon= g e, unsigned int nf) { /* Clean up the previous iteration. */ L3T_UNLOCK(current_l3page); + UNMAP_DOMAIN_PAGE(pl2e); UNMAP_DOMAIN_PAGE(pl3e); =20 pl3e =3D virt_to_xen_l3e(v); @@ -5614,6 +5616,7 @@ int modify_xen_mappings(unsigned long s, unsigned lon= g e, unsigned int nf) if ( l3e_get_flags(*pl3e) & _PAGE_PSE ) { l2_pgentry_t *l2t; + mfn_t l2mfn; =20 if ( l2_table_offset(v) =3D=3D 0 && l1_table_offset(v) =3D=3D 0 && @@ -5630,35 +5633,38 @@ int modify_xen_mappings(unsigned long s, unsigned l= ong e, unsigned int nf) } =20 /* PAGE1GB: shatter the superpage and fall through. */ - l2t =3D alloc_xen_pagetable(); - if ( !l2t ) + l2mfn =3D alloc_xen_pagetable_new(); + if ( mfn_eq(l2mfn, INVALID_MFN) ) goto out; =20 + l2t =3D map_domain_page(l2mfn); for ( i =3D 0; i < L2_PAGETABLE_ENTRIES; i++ ) l2e_write(l2t + i, l2e_from_pfn(l3e_get_pfn(*pl3e) + (i << PAGETABLE_ORDER), l3e_get_flags(*pl3e))); + UNMAP_DOMAIN_PAGE(l2t); + if ( locking ) spin_lock(&map_pgdir_lock); if ( (l3e_get_flags(*pl3e) & _PAGE_PRESENT) && (l3e_get_flags(*pl3e) & _PAGE_PSE) ) { - l3e_write_atomic(pl3e, l3e_from_mfn(virt_to_mfn(l2t), - __PAGE_HYPERVISOR)); - l2t =3D NULL; + l3e_write_atomic(pl3e, + l3e_from_mfn(l2mfn, __PAGE_HYPERVISOR)); + l2mfn =3D INVALID_MFN; } if ( locking ) spin_unlock(&map_pgdir_lock); - if ( l2t ) - free_xen_pagetable(l2t); + + free_xen_pagetable_new(l2mfn); } =20 /* * The L3 entry has been verified to be present, and we've dealt w= ith * 1G pages as well, so the L2 table cannot require allocation. */ - pl2e =3D l3e_to_l2e(*pl3e) + l2_table_offset(v); + pl2e =3D map_l2t_from_l3e(*pl3e) + l2_table_offset(v); =20 if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) ) { @@ -5686,41 +5692,45 @@ int modify_xen_mappings(unsigned long s, unsigned l= ong e, unsigned int nf) else { l1_pgentry_t *l1t; - /* PSE: shatter the superpage and try again. */ - l1t =3D alloc_xen_pagetable(); - if ( !l1t ) + mfn_t l1mfn =3D alloc_xen_pagetable_new(); + + if ( mfn_eq(l1mfn, INVALID_MFN) ) goto out; =20 + l1t =3D map_domain_page(l1mfn); for ( i =3D 0; i < L1_PAGETABLE_ENTRIES; i++ ) l1e_write(&l1t[i], l1e_from_pfn(l2e_get_pfn(*pl2e) + i, l2e_get_flags(*pl2e) & ~_PAGE_P= SE)); + UNMAP_DOMAIN_PAGE(l1t); + if ( locking ) spin_lock(&map_pgdir_lock); if ( (l2e_get_flags(*pl2e) & _PAGE_PRESENT) && (l2e_get_flags(*pl2e) & _PAGE_PSE) ) { - l2e_write_atomic(pl2e, l2e_from_mfn(virt_to_mfn(l1t), + l2e_write_atomic(pl2e, l2e_from_mfn(l1mfn, __PAGE_HYPERVISOR)= ); - l1t =3D NULL; + l1mfn =3D INVALID_MFN; } if ( locking ) spin_unlock(&map_pgdir_lock); - if ( l1t ) - free_xen_pagetable(l1t); + + free_xen_pagetable_new(l1mfn); } } else { l1_pgentry_t nl1e, *l1t; + mfn_t l1mfn; =20 /* * Ordinary 4kB mapping: The L2 entry has been verified to be * present, and we've dealt with 2M pages as well, so the L1 t= able * cannot require allocation. */ - pl1e =3D l2e_to_l1e(*pl2e) + l1_table_offset(v); + pl1e =3D map_l1t_from_l2e(*pl2e) + l1_table_offset(v); =20 /* Confirm the caller isn't trying to create new mappings. */ if ( !(l1e_get_flags(*pl1e) & _PAGE_PRESENT) ) @@ -5731,6 +5741,7 @@ int modify_xen_mappings(unsigned long s, unsigned lon= g e, unsigned int nf) (l1e_get_flags(*pl1e) & ~FLAGS_MASK) | nf); =20 l1e_write_atomic(pl1e, nl1e); + UNMAP_DOMAIN_PAGE(pl1e); v +=3D PAGE_SIZE; =20 /* @@ -5760,10 +5771,12 @@ int modify_xen_mappings(unsigned long s, unsigned l= ong e, unsigned int nf) continue; } =20 - l1t =3D l2e_to_l1e(*pl2e); + l1mfn =3D l2e_get_mfn(*pl2e); + l1t =3D map_domain_page(l1mfn); for ( i =3D 0; i < L1_PAGETABLE_ENTRIES; i++ ) if ( l1e_get_intpte(l1t[i]) !=3D 0 ) break; + UNMAP_DOMAIN_PAGE(l1t); if ( i =3D=3D L1_PAGETABLE_ENTRIES ) { /* Empty: zap the L2E and free the L1 page. */ @@ -5771,7 +5784,7 @@ int modify_xen_mappings(unsigned long s, unsigned lon= g e, unsigned int nf) if ( locking ) spin_unlock(&map_pgdir_lock); flush_area(NULL, FLUSH_TLB_GLOBAL); /* flush before free */ - free_xen_pagetable(l1t); + free_xen_pagetable_new(l1mfn); } else if ( locking ) spin_unlock(&map_pgdir_lock); @@ -5802,11 +5815,13 @@ int modify_xen_mappings(unsigned long s, unsigned l= ong e, unsigned int nf) =20 { l2_pgentry_t *l2t; + mfn_t l2mfn =3D l3e_get_mfn(*pl3e); =20 - l2t =3D l3e_to_l2e(*pl3e); + l2t =3D map_domain_page(l2mfn); for ( i =3D 0; i < L2_PAGETABLE_ENTRIES; i++ ) if ( l2e_get_intpte(l2t[i]) !=3D 0 ) break; + UNMAP_DOMAIN_PAGE(l2t); if ( i =3D=3D L2_PAGETABLE_ENTRIES ) { /* Empty: zap the L3E and free the L2 page. */ @@ -5814,7 +5829,7 @@ int modify_xen_mappings(unsigned long s, unsigned lon= g e, unsigned int nf) if ( locking ) spin_unlock(&map_pgdir_lock); flush_area(NULL, FLUSH_TLB_GLOBAL); /* flush before free */ - free_xen_pagetable(l2t); + free_xen_pagetable_new(l2mfn); } else if ( locking ) spin_unlock(&map_pgdir_lock); --=20 2.23.4