x86: don't blindly create L3 tables for the direct map
authorJan Beulich <jbeulich@suse.com>
Mon, 30 Sep 2013 13:28:12 +0000 (15:28 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 30 Sep 2013 13:28:12 +0000 (15:28 +0200)
Now that the direct map area can extend all the way up to almost the
end of address space, this is wasteful.

Also fold two almost redundant messages in SRAT parsing into one.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Malcolm Crossley <malcolm.crossley@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Keir Fraser <keir@xen.org>
xen/arch/x86/mm.c
xen/arch/x86/srat.c
xen/arch/x86/x86_64/mm.c
xen/include/asm-x86/mm.h

index e7f0e134abc7b6cd8ebc627f3c8b86e0c91818df..7d4215daccc32ea0e7274ba55f4896d16e8c1bf5 100644 (file)
@@ -137,7 +137,7 @@ l1_pgentry_t __attribute__ ((__section__ (".bss.page_aligned")))
 #define PTE_UPDATE_WITH_CMPXCHG
 #endif
 
-bool_t __read_mostly mem_hotplug = 0;
+paddr_t __read_mostly mem_hotplug;
 
 /* Private domain structs for DOMID_XEN and DOMID_IO. */
 struct domain *dom_xen, *dom_io, *dom_cow;
index ff73881652737ecd8cb1e663b22876f66aecf49e..2b052721c46a5534da7996b98d7ccf939e5ccad8 100644 (file)
@@ -113,6 +113,7 @@ static __init void bad_srat(void)
                apicid_to_node[i] = NUMA_NO_NODE;
        for (i = 0; i < ARRAY_SIZE(pxm2node); i++)
                pxm2node[i] = NUMA_NO_NODE;
+       mem_hotplug = 0;
 }
 
 /*
@@ -257,13 +258,6 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
                return;
        }
        /* It is fine to add this area to the nodes data it will be used later*/
-       if (ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)
-       {
-               printk(KERN_INFO "SRAT: hot plug zone found %"PRIx64" - %"PRIx64" \n",
-                               start, end);
-               mem_hotplug = 1;
-       }
-
        i = conflicting_memblks(start, end);
        if (i == node) {
                printk(KERN_WARNING
@@ -287,8 +281,11 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
                if (nd->end < end)
                        nd->end = end;
        }
-       printk(KERN_INFO "SRAT: Node %u PXM %u %"PRIx64"-%"PRIx64"\n", node, pxm,
-              start, end);
+       if ((ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) && end > mem_hotplug)
+               mem_hotplug = end;
+       printk(KERN_INFO "SRAT: Node %u PXM %u %"PRIx64"-%"PRIx64"%s\n",
+              node, pxm, start, end,
+              ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE ? " (hotplug)" : "");
 
        node_memblk_range[num_node_memblks].start = start;
        node_memblk_range[num_node_memblks].end = end;
index 26cb998b0c9ca18c59548670cd15ff671ca626fb..84a2434da5a1ea005aba766dcc53cf77d862b0f4 100644 (file)
@@ -559,25 +559,20 @@ void __init paging_init(void)
      * We setup the L3s for 1:1 mapping if host support memory hotplug
      * to avoid sync the 1:1 mapping on page fault handler
      */
-    if ( mem_hotplug )
+    for ( va = DIRECTMAP_VIRT_START;
+          va < DIRECTMAP_VIRT_END && (void *)va < __va(mem_hotplug);
+          va += (1UL << L4_PAGETABLE_SHIFT) )
     {
-        unsigned long va;
-
-        for ( va = DIRECTMAP_VIRT_START;
-              va < DIRECTMAP_VIRT_END;
-              va += (1UL << L4_PAGETABLE_SHIFT) )
+        if ( !(l4e_get_flags(idle_pg_table[l4_table_offset(va)]) &
+              _PAGE_PRESENT) )
         {
-            if ( !(l4e_get_flags(idle_pg_table[l4_table_offset(va)]) &
-                  _PAGE_PRESENT) )
-            {
-                l3_pg = alloc_domheap_page(NULL, 0);
-                if ( !l3_pg )
-                    goto nomem;
-                l3_ro_mpt = page_to_virt(l3_pg);
-                clear_page(l3_ro_mpt);
-                l4e_write(&idle_pg_table[l4_table_offset(va)],
-                  l4e_from_page(l3_pg, __PAGE_HYPERVISOR));
-            }
+            l3_pg = alloc_domheap_page(NULL, 0);
+            if ( !l3_pg )
+                goto nomem;
+            l3_ro_mpt = page_to_virt(l3_pg);
+            clear_page(l3_ro_mpt);
+            l4e_write(&idle_pg_table[l4_table_offset(va)],
+                      l4e_from_page(l3_pg, __PAGE_HYPERVISOR));
         }
     }
 
index 213fc9cb37cd557f9738f621dd8adee908a73886..5f0387528bf672d4541b4714ed9f4c031362c98c 100644 (file)
@@ -399,7 +399,7 @@ static inline int get_page_and_type(struct page_info *page,
 int check_descriptor(const struct domain *, struct desc_struct *d);
 
 extern bool_t opt_allow_superpage;
-extern bool_t mem_hotplug;
+extern paddr_t mem_hotplug;
 
 /******************************************************************************
  * With shadow pagetables, the different kinds of address start