|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/mm: Don't allow p2m allocation after memory is allocated.
This avoids a potentially long loop populating the p2m table from the
m2p. Since there's no reason to turn on translate mode after the
domain is already running, this shouldn't be a problem.
Signed-off-by: Tim Deegan <tim@xxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/x86/mm/p2m.c | 32 +++++++++-----------------------
1 file changed, 9 insertions(+), 23 deletions(-)
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index 8f380ed..d7dd480 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -379,14 +379,19 @@ void p2m_free_ptp(struct p2m_domain *p2m, struct
page_info *pg)
//
int p2m_alloc_table(struct p2m_domain *p2m)
{
- mfn_t mfn = _mfn(INVALID_MFN);
- struct page_info *page, *p2m_top;
- unsigned int page_count = 0;
- unsigned long gfn = -1UL;
+ struct page_info *p2m_top;
struct domain *d = p2m->domain;
p2m_lock(p2m);
+ if ( !p2m_is_nestedp2m(p2m)
+ && !page_list_empty(&d->page_list) )
+ {
+ P2M_ERROR("dom %d already has memory allocated\n", d->domain_id);
+ p2m_unlock(p2m);
+ return -EINVAL;
+ }
+
if ( pagetable_get_pfn(p2m_get_pagetable(p2m)) != 0 )
{
P2M_ERROR("p2m already allocated for this domain\n");
@@ -415,31 +420,12 @@ int p2m_alloc_table(struct p2m_domain *p2m)
if ( !set_p2m_entry(p2m, 0, _mfn(INVALID_MFN), PAGE_ORDER_4K,
p2m_invalid, p2m->default_access) )
goto error;
-
- if ( !p2m_is_nestedp2m(p2m) )
- {
- /* Copy all existing mappings from the page list and m2p */
- spin_lock(&p2m->domain->page_alloc_lock);
- page_list_for_each(page, &p2m->domain->page_list)
- {
- mfn = page_to_mfn(page);
- gfn = get_gpfn_from_mfn(mfn_x(mfn));
- /* Pages should not be shared that early */
- ASSERT(gfn != SHARED_M2P_ENTRY);
- page_count++;
- if ( gfn != INVALID_M2P_ENTRY
- && !set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_rw,
p2m->default_access) )
- goto error_unlock;
- }
- spin_unlock(&p2m->domain->page_alloc_lock);
- }
p2m->defer_nested_flush = 0;
P2M_PRINTK("p2m table initialised (%u pages)\n", page_count);
p2m_unlock(p2m);
return 0;
-error_unlock:
spin_unlock(&p2m->domain->page_alloc_lock);
error:
P2M_PRINTK("failed to initialize p2m table, gfn=%05lx, mfn=%"
--
1.8.5.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |