x86/P2M: introduce p2m_{add,remove}_page()

Rename guest_physmap_add_entry() to p2m_add_page(); make
guest_physmap_remove_page() a trivial wrapper around p2m_remove_page().
This way callers can use suitable pairs of functions (previously
violated by hvm/grant_table.c).

In HVM-specific code further avoid going through the guest_physmap_*()
layer, and instead use the two new/renamed functions directly.

Ultimately the goal is to have guest_physmap_...() functions cover all
types of guests, but p2m_...() dealing only with translated ones.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Paul Durrant <paul@xen.org>
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
This commit is contained in:
Jan Beulich committed 2022-04-07 08:29:33 +02:00
1 parent 0cd09bf305
commit fa4b4fa61d
5 files changed
+36 -26

No files matched your search

+1 -2
View File
@@ -173,8 +173,7 @@ static int __init pvh_populate_memory_range(struct domain *d,
continue;
}
rc = guest_physmap_add_page(d, _gfn(start), page_to_mfn(page),
order);
rc = p2m_add_page(d, _gfn(start), page_to_mfn(page), order, p2m_ram_rw);
if ( rc != 0 )
{
printk("Failed to populate memory: [%#lx,%#lx): %d\n",
+3 -4
View File
@@ -39,9 +39,8 @@ int create_grant_p2m_mapping(uint64_t addr, mfn_t frame,
p2mt = p2m_grant_map_ro;
else
p2mt = p2m_grant_map_rw;
rc = guest_physmap_add_entry(current->domain,
_gfn(addr >> PAGE_SHIFT),
frame, PAGE_ORDER_4K, p2mt);
rc = p2m_add_page(current->domain, _gfn(addr >> PAGE_SHIFT),
frame, PAGE_ORDER_4K, p2mt);
if ( rc )
return GNTST_general_error;
else
@@ -68,7 +67,7 @@ int replace_grant_p2m_mapping(uint64_t addr, mfn_t frame,
type, mfn_x(old_mfn), mfn_x(frame));
return GNTST_general_error;
}
if ( guest_physmap_remove_page(d, _gfn(gfn), frame, PAGE_ORDER_4K) )
if ( p2m_remove_page(d, _gfn(gfn), frame, PAGE_ORDER_4K) )
{
put_gfn(d, gfn);
return GNTST_general_error;
+2 -4
View File
@@ -188,8 +188,7 @@ static void hvm_remove_ioreq_gfn(struct ioreq_server *s, bool buf)
if ( gfn_eq(iorp->gfn, INVALID_GFN) )
return;
if ( guest_physmap_remove_page(d, iorp->gfn,
page_to_mfn(iorp->page), 0) )
if ( p2m_remove_page(d, iorp->gfn, page_to_mfn(iorp->page), 0) )
domain_crash(d);
clear_page(iorp->va);
}
@@ -205,8 +204,7 @@ static int hvm_add_ioreq_gfn(struct ioreq_server *s, bool buf)
clear_page(iorp->va);
rc = guest_physmap_add_page(d, iorp->gfn,
page_to_mfn(iorp->page), 0);
rc = p2m_add_page(d, iorp->gfn, page_to_mfn(iorp->page), 0, p2m_ram_rw);
if ( rc == 0 )
paging_mark_pfn_dirty(d, _pfn(gfn_x(iorp->gfn)));
+5 -4
View File
@@ -577,10 +577,11 @@ int p2m_alloc_table(struct p2m_domain *p2m);
void p2m_teardown(struct p2m_domain *p2m);
void p2m_final_teardown(struct domain *d);
/* Add a page to a domain's p2m table */
int guest_physmap_add_entry(struct domain *d, gfn_t gfn,
mfn_t mfn, unsigned int page_order,
p2m_type_t t);
/* Add/remove a page to/from a domain's p2m table. */
int p2m_add_page(struct domain *d, gfn_t gfn, mfn_t mfn,
unsigned int page_order, p2m_type_t t);
int p2m_remove_page(struct domain *d, gfn_t gfn, mfn_t mfn,
unsigned int page_order);
/* Untyped version for RAM only, for compatibility and PV. */
int __must_check guest_physmap_add_page(struct domain *d, gfn_t gfn, mfn_t mfn,
+25 -12
View File
@@ -850,15 +850,17 @@ p2m_remove_entry(struct p2m_domain *p2m, gfn_t gfn, mfn_t mfn,
}
int
guest_physmap_remove_page(struct domain *d, gfn_t gfn,
mfn_t mfn, unsigned int page_order)
p2m_remove_page(struct domain *d, gfn_t gfn, mfn_t mfn,
unsigned int page_order)
{
struct p2m_domain *p2m = p2m_get_hostp2m(d);
int rc;
/* IOMMU for PV guests is handled in get_page_type() and put_page(). */
if ( !paging_mode_translate(d) )
return 0;
{
ASSERT_UNREACHABLE();
return -EPERM;
}
gfn_lock(p2m, gfn, page_order);
rc = p2m_remove_entry(p2m, gfn, mfn, page_order);
@@ -867,6 +869,17 @@ guest_physmap_remove_page(struct domain *d, gfn_t gfn,
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
@@ -905,14 +918,14 @@ guest_physmap_add_page(struct domain *d, gfn_t gfn, mfn_t mfn,
return 0;
}
return guest_physmap_add_entry(d, gfn, mfn, page_order, p2m_ram_rw);
return p2m_add_page(d, gfn, mfn, page_order, p2m_ram_rw);
}
#ifdef CONFIG_HVM
int
guest_physmap_add_entry(struct domain *d, gfn_t gfn, mfn_t mfn,
unsigned int page_order, p2m_type_t t)
p2m_add_page(struct domain *d, gfn_t gfn, mfn_t mfn,
unsigned int page_order, p2m_type_t t)
{
struct p2m_domain *p2m = p2m_get_hostp2m(d);
unsigned long i;
@@ -2724,7 +2737,7 @@ static int p2m_add_foreign(struct domain *tdom, unsigned long fgfn,
{
if ( is_special_page(mfn_to_page(prev_mfn)) )
/* Special pages are simply unhooked from this phys slot */
rc = guest_physmap_remove_page(tdom, _gfn(gpfn), prev_mfn, 0);
rc = p2m_remove_page(tdom, _gfn(gpfn), prev_mfn, 0);
else
/* Normal domain memory is freed, to avoid leaking memory. */
rc = guest_remove_page(tdom, gpfn);
@@ -2732,7 +2745,7 @@ static int p2m_add_foreign(struct domain *tdom, unsigned long fgfn,
goto put_both;
}
/*
* Create the new mapping. Can't use guest_physmap_add_page() because it
* Create the new mapping. Can't use p2m_add_page() because it
* will update the m2p table which will result in mfn -> gpfn of dom0
* and not fgfn of domU.
*/
@@ -2846,7 +2859,7 @@ int xenmem_add_to_physmap_one(
{
if ( is_special_page(mfn_to_page(prev_mfn)) )
/* Special pages are simply unhooked from this phys slot. */
rc = guest_physmap_remove_page(d, gpfn, prev_mfn, PAGE_ORDER_4K);
rc = p2m_remove_page(d, gpfn, prev_mfn, PAGE_ORDER_4K);
else if ( !mfn_eq(mfn, prev_mfn) )
/* Normal domain memory is freed, to avoid leaking memory. */
rc = guest_remove_page(d, gfn_x(gpfn));
@@ -2854,11 +2867,11 @@ int xenmem_add_to_physmap_one(
/* Unmap from old location, if any. */
if ( !rc && old_gpfn != INVALID_M2P_ENTRY && !gfn_eq(_gfn(old_gpfn), gpfn) )
rc = guest_physmap_remove_page(d, _gfn(old_gpfn), mfn, PAGE_ORDER_4K);
rc = p2m_remove_page(d, _gfn(old_gpfn), mfn, PAGE_ORDER_4K);
/* Map at new location. */
if ( !rc )
rc = guest_physmap_add_page(d, gpfn, mfn, PAGE_ORDER_4K);
rc = p2m_add_page(d, gpfn, mfn, PAGE_ORDER_4K, p2m_ram_rw);
put_all:
put_gfn(d, gfn_x(gpfn));
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.