diff mbox series

[RFC,64/84] mapcache: initialise the mapcache even for the idle domain.

Message ID d6b26c63a2d870dcb3a595a41fc1b51642123662.1569489002.git.hongyax@amazon.com (mailing list archive)
State New, archived
Headers show
Series Remove direct map from Xen | expand

Commit Message

Xia, Hongyan Sept. 26, 2019, 9:46 a.m. UTC
From: Hongyan Xia <hongyax@amazon.com>

In situations like in irqs or domain creation, PMAP cannot be used or
the mapcache of that domain is simply not ready. We need to have a
mapcache in the idle domain to map pages to deal with these.

After this patch, map_domain_page() completely gets rid of the direct
map. The assertions ensure mappings only happen within PMAP or MAPCACHE
regions. As a result, map_xen_pagetable() gets rid of the direct map as
well.

Signed-off-by: Hongyan Xia <hongyax@amazon.com>
---
 xen/arch/x86/mm.c     | 3 +++
 xen/common/schedule.c | 1 +
 2 files changed, 4 insertions(+)
diff mbox series

Patch

diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 9619182f52..f30b5b3951 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -5858,6 +5858,9 @@  int create_perdomain_mapping(struct domain *d, unsigned long va,
         l3tab = __map_domain_page(pg);
         clear_page(l3tab);
         d->arch.perdomain_l3_pg = pg;
+        if ( is_idle_domain(d) )
+            idle_pg_table[l4_table_offset(PERDOMAIN_VIRT_START)] =
+                    l4e_from_page(pg, __PAGE_HYPERVISOR_RW);
         if ( !nr )
         {
             unmap_domain_page(l3tab);
diff --git a/xen/common/schedule.c b/xen/common/schedule.c
index 7b71581756..e687be33a3 100644
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -1814,6 +1814,7 @@  void __init scheduler_init(void)
     BUG_ON(nr_cpu_ids > ARRAY_SIZE(idle_vcpu));
     idle_domain->vcpu = idle_vcpu;
     idle_domain->max_vcpus = nr_cpu_ids;
+    mapcache_domain_init(idle_domain);
     if ( vcpu_create(idle_domain, 0, 0) == NULL )
         BUG();
     this_cpu(schedule_data).sched_priv = sched_alloc_pdata(&ops, 0);