[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/mm: move guest_physmap_{add,remove}_page()
commit 0e58a6ceb6ef4e0c47acd3c7e48bb904c4d1a0a8 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Thu Apr 7 08:30:36 2022 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Apr 7 08:30:36 2022 +0200 x86/mm: move guest_physmap_{add,remove}_page() ... to a new file, separating the functions from their HVM-specific backing ones, themselves only dealing with the non-translated case. To avoid having a new CONFIG_HVM conditional in there, do away with the inline placeholder. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: George Dunlap <george.dunlap@xxxxxxxxxx> --- xen/arch/x86/mm/Makefile | 1 + xen/arch/x86/mm/p2m.c | 54 ---------------------------- xen/arch/x86/mm/physmap.c | 85 ++++++++++++++++++++++++++++++++++++++++++++ xen/include/xen/p2m-common.h | 9 ----- 4 files changed, 86 insertions(+), 63 deletions(-) diff --git a/xen/arch/x86/mm/Makefile b/xen/arch/x86/mm/Makefile index 6b7882d992..a47ef5fd9f 100644 --- a/xen/arch/x86/mm/Makefile +++ b/xen/arch/x86/mm/Makefile @@ -10,3 +10,4 @@ obj-$(CONFIG_MEM_SHARING) += mem_sharing.o obj-y += p2m.o obj-$(CONFIG_HVM) += p2m-ept.o p2m-pod.o p2m-pt.o obj-y += paging.o +obj-y += physmap.o diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index 056a622c95..a01e42ee61 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -869,60 +869,6 @@ p2m_remove_page(struct domain *d, gfn_t gfn, mfn_t mfn, return rc; } -int -guest_physmap_remove_page(struct domain *d, gfn_t gfn, - mfn_t mfn, unsigned int page_order) -{ - /* IOMMU for PV guests is handled in get_page_type() and put_page(). */ - if ( !paging_mode_translate(d) ) - return 0; - - return p2m_remove_page(d, gfn, mfn, page_order); -} - -#endif /* CONFIG_HVM */ - -int -guest_physmap_add_page(struct domain *d, gfn_t gfn, mfn_t mfn, - unsigned int page_order) -{ - /* IOMMU for PV guests is handled in get_page_type() and put_page(). */ - if ( !paging_mode_translate(d) ) - { - struct page_info *page = mfn_to_page(mfn); - unsigned long i; - - /* - * Our interface for PV guests wrt IOMMU entries hasn't been very - * clear; but historically, pages have started out with IOMMU mappings, - * and only lose them when changed to a different page type. - * - * Retain this property by grabbing a writable type ref and then - * dropping it immediately. The result will be pages that have a - * writable type (and an IOMMU entry), but a count of 0 (such that - * any guest-requested type changes succeed and remove the IOMMU - * entry). - */ - for ( i = 0; i < (1UL << page_order); ++i, ++page ) - { - if ( !need_iommu_pt_sync(d) ) - /* nothing */; - else if ( get_page_and_type(page, d, PGT_writable_page) ) - put_page_and_type(page); - else - return -EINVAL; - - set_gpfn_from_mfn(mfn_x(mfn) + i, gfn_x(gfn) + i); - } - - return 0; - } - - return p2m_add_page(d, gfn, mfn, page_order, p2m_ram_rw); -} - -#ifdef CONFIG_HVM - int p2m_add_page(struct domain *d, gfn_t gfn, mfn_t mfn, unsigned int page_order, p2m_type_t t) diff --git a/xen/arch/x86/mm/physmap.c b/xen/arch/x86/mm/physmap.c new file mode 100644 index 0000000000..ea82a07283 --- /dev/null +++ b/xen/arch/x86/mm/physmap.c @@ -0,0 +1,85 @@ +/****************************************************************************** + * arch/x86/mm/physmap.c + * + * Parts of this code are Copyright (c) 2009 by Citrix Systems, Inc. (Patrick Colp) + * Parts of this code are Copyright (c) 2007 by Advanced Micro Devices. + * Parts of this code are Copyright (c) 2006-2007 by XenSource Inc. + * Parts of this code are Copyright (c) 2006 by Michael A Fetterman + * Parts based on earlier work by Michael A Fetterman, Ian Pratt et al. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; If not, see <http://www.gnu.org/licenses/>. + */ + +#include <asm/p2m.h> + +#include "mm-locks.h" + +int +guest_physmap_add_page(struct domain *d, gfn_t gfn, mfn_t mfn, + unsigned int page_order) +{ + /* IOMMU for PV guests is handled in get_page_type() and put_page(). */ + if ( !paging_mode_translate(d) ) + { + struct page_info *page = mfn_to_page(mfn); + unsigned long i; + + /* + * Our interface for PV guests wrt IOMMU entries hasn't been very + * clear; but historically, pages have started out with IOMMU mappings, + * and only lose them when changed to a different page type. + * + * Retain this property by grabbing a writable type ref and then + * dropping it immediately. The result will be pages that have a + * writable type (and an IOMMU entry), but a count of 0 (such that + * any guest-requested type changes succeed and remove the IOMMU + * entry). + */ + for ( i = 0; i < (1UL << page_order); ++i, ++page ) + { + if ( !need_iommu_pt_sync(d) ) + /* nothing */; + else if ( get_page_and_type(page, d, PGT_writable_page) ) + put_page_and_type(page); + else + return -EINVAL; + + set_gpfn_from_mfn(mfn_x(mfn) + i, gfn_x(gfn) + i); + } + + return 0; + } + + return p2m_add_page(d, gfn, mfn, page_order, p2m_ram_rw); +} + +int +guest_physmap_remove_page(struct domain *d, gfn_t gfn, + mfn_t mfn, unsigned int page_order) +{ + /* IOMMU for PV guests is handled in get_page_type() and put_page(). */ + if ( !paging_mode_translate(d) ) + return 0; + + return p2m_remove_page(d, gfn, mfn, page_order); +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/xen/p2m-common.h b/xen/include/xen/p2m-common.h index 80bac95057..a322e738ef 100644 --- a/xen/include/xen/p2m-common.h +++ b/xen/include/xen/p2m-common.h @@ -8,18 +8,9 @@ int set_foreign_p2m_entry(struct domain *d, const struct domain *fd, unsigned long gfn, mfn_t mfn); /* Remove a page from a domain's p2m table */ -#ifdef CONFIG_HVM int __must_check guest_physmap_remove_page(struct domain *d, gfn_t gfn, mfn_t mfn, unsigned int page_order); -#else -static inline int -guest_physmap_remove_page(struct domain *d, gfn_t gfn, mfn_t mfn, - unsigned int page_order) -{ - return 0; -} -#endif /* Map MMIO regions in the p2m: start_gfn and nr describe the range in * * the guest physical address space to map, starting from the machine -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |