diff options
author | Jan Beulich <jbeulich@suse.com> | 2013-09-30 15:28:12 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-09-30 15:28:12 +0200 |
commit | ca145fe70bad3a25ad54c6ded1ef237e45a2311e (patch) | |
tree | 8f8d0777a9dd4d77ce09d239632b30de8f81d75c /xen/arch/x86/x86_64/mm.c | |
parent | 28b706efb6abb637fabfd74cde70a50935a5640b (diff) | |
download | xen-ca145fe70bad3a25ad54c6ded1ef237e45a2311e.tar.gz xen-ca145fe70bad3a25ad54c6ded1ef237e45a2311e.tar.bz2 xen-ca145fe70bad3a25ad54c6ded1ef237e45a2311e.zip |
x86: don't blindly create L3 tables for the direct map
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>
Diffstat (limited to 'xen/arch/x86/x86_64/mm.c')
-rw-r--r-- | xen/arch/x86/x86_64/mm.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 26cb998b0c..84a2434da5 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -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)); } } |