x86/mm: build map_domain_gfn() just once

It doesn't depend on GUEST_PAGING_LEVELS. Moving the function to p2m.c
at once allows a bogus #define/#include pair to be removed from
hap/nested_ept.c.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by:  George Dunlap <george.dunlap@citrix.com>
This commit is contained in:
Jan Beulich committed 2015-10-27 11:46:05 +01:00
1 parent 1a771b7a0d
commit 9a6787cc38
5 files changed
+41 -48

No files matched your search

-40
View File
@@ -88,46 +88,6 @@ static uint32_t set_ad_bits(void *guest_p, void *walk_p, int set_dirty)
return 0;
}
/* If the map is non-NULL, we leave this function having
* acquired an extra ref on mfn_to_page(*mfn) */
void *map_domain_gfn(struct p2m_domain *p2m, gfn_t gfn, mfn_t *mfn,
p2m_type_t *p2mt, p2m_query_t q, uint32_t *rc)
{
struct page_info *page;
void *map;
/* Translate the gfn, unsharing if shared */
page = get_page_from_gfn_p2m(p2m->domain, p2m, gfn_x(gfn), p2mt, NULL,
q);
if ( p2m_is_paging(*p2mt) )
{
ASSERT(p2m_is_hostp2m(p2m));
if ( page )
put_page(page);
p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
*rc = _PAGE_PAGED;
return NULL;
}
if ( p2m_is_shared(*p2mt) )
{
if ( page )
put_page(page);
*rc = _PAGE_SHARED;
return NULL;
}
if ( !page )
{
*rc |= _PAGE_PRESENT;
return NULL;
}
*mfn = _mfn(page_to_mfn(page));
ASSERT(mfn_valid(mfn_x(*mfn)));
map = map_domain_page(*mfn);
return map;
}
/* Walk the guest pagetables, after the manner of a hardware walker. */
/* Because the walk is essentially random, it can cause a deadlock
* warning in the p2m locking code. Highly unlikely this is an actual
-4
View File
@@ -34,10 +34,6 @@
#include <asm/hvm/vmx/vmx.h>
#include <asm/hvm/vmx/vvmx.h>
/* EPT always use 4-level paging structure */
#define GUEST_PAGING_LEVELS 4
#include <asm/guest_pt.h>
/* Must reserved bits in all level entries */
#define EPT_MUST_RSV_BITS (((1ull << PADDR_BITS) - 1) & \
~((1ull << paddr_bits) - 1))
+38
View File
@@ -2053,6 +2053,44 @@ unsigned long paging_gva_to_gfn(struct vcpu *v,
return hostmode->gva_to_gfn(v, hostp2m, va, pfec);
}
/*
* If the map is non-NULL, we leave this function having
* acquired an extra ref on mfn_to_page(*mfn).
*/
void *map_domain_gfn(struct p2m_domain *p2m, gfn_t gfn, mfn_t *mfn,
p2m_type_t *p2mt, p2m_query_t q, uint32_t *rc)
{
struct page_info *page;
/* Translate the gfn, unsharing if shared. */
page = get_page_from_gfn_p2m(p2m->domain, p2m, gfn_x(gfn), p2mt, NULL, q);
if ( p2m_is_paging(*p2mt) )
{
ASSERT(p2m_is_hostp2m(p2m));
if ( page )
put_page(page);
p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
*rc = _PAGE_PAGED;
return NULL;
}
if ( p2m_is_shared(*p2mt) )
{
if ( page )
put_page(page);
*rc = _PAGE_SHARED;
return NULL;
}
if ( !page )
{
*rc |= _PAGE_PRESENT;
return NULL;
}
*mfn = page_to_mfn(page);
ASSERT(mfn_valid(*mfn));
return map_domain_page(*mfn);
}
int map_mmio_regions(struct domain *d,
unsigned long start_gfn,
unsigned long nr,
-4
View File
@@ -305,10 +305,6 @@ guest_walk_to_page_order(walk_t *gw)
#define GPT_RENAME2(_n, _l) _n ## _ ## _l ## _levels
#define GPT_RENAME(_n, _l) GPT_RENAME2(_n, _l)
#define guest_walk_tables GPT_RENAME(guest_walk_tables, GUEST_PAGING_LEVELS)
#define map_domain_gfn GPT_RENAME(map_domain_gfn, GUEST_PAGING_LEVELS)
void *map_domain_gfn(struct p2m_domain *p2m, gfn_t gfn, mfn_t *mfn,
p2m_type_t *p2mt, p2m_query_t q, uint32_t *rc);
extern uint32_t
guest_walk_tables(struct vcpu *v, struct p2m_domain *p2m, unsigned long va,
+3
View File
@@ -680,6 +680,9 @@ int p2m_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn,
/* Set up function pointers for PT implementation: only for use by p2m code */
extern void p2m_pt_init(struct p2m_domain *p2m);
void *map_domain_gfn(struct p2m_domain *p2m, gfn_t gfn, mfn_t *mfn,
p2m_type_t *p2mt, p2m_query_t q, uint32_t *rc);
/* Debugging and auditing of the P2M code? */
#ifndef NDEBUG
#define P2M_AUDIT 1
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.