# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1210860909 -3600
# Node ID 12e74c1433a6305a7f5fbaa7bd34f0dcfabe06fc
# Parent c6e36a53cf054df48d892da2bb0145a5f111387a
linux/x86-64: initialization code cleanup
Since init_memory_mapping() installs the pgd entry after populating
all lower level tables, the whole mechanism can be coded to avoid
using xen_l?_entry_update() on pages that aren't page tables
(yet). Also, __set_pte() is a pure duplicate of set_pte() and hence
can go away.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---
arch/x86_64/mm/init-xen.c | 54 ++++++++++++++++++++++------------------------
1 files changed, 26 insertions(+), 28 deletions(-)
diff -r c6e36a53cf05 -r 12e74c1433a6 arch/x86_64/mm/init-xen.c
--- a/arch/x86_64/mm/init-xen.c Thu May 15 15:14:31 2008 +0100
+++ b/arch/x86_64/mm/init-xen.c Thu May 15 15:15:09 2008 +0100
@@ -59,6 +59,8 @@ EXPORT_SYMBOL(__kernel_page_user);
EXPORT_SYMBOL(__kernel_page_user);
#endif
+int after_bootmem;
+
extern unsigned long *contiguous_bitmap;
static unsigned long dma_reserve __initdata;
@@ -82,6 +84,8 @@ static void __meminit early_make_page_re
unsigned long addr, _va = (unsigned long)va;
pte_t pte, *ptep;
unsigned long *page = (unsigned long *) init_level4_pgt;
+
+ BUG_ON(after_bootmem);
if (xen_feature(feature))
return;
@@ -207,7 +211,6 @@ void show_mem(void)
printk(KERN_INFO "%lu pages swap cached\n",cached);
}
-int after_bootmem;
static __init void *spp_getpage(void)
{
@@ -373,11 +376,6 @@ static __meminit void *alloc_static_page
#define PTE_SIZE PAGE_SIZE
-static inline void __set_pte(pte_t *dst, pte_t val)
-{
- *dst = val;
-}
-
static inline int make_readonly(unsigned long paddr)
{
extern char __vsyscall_0;
@@ -446,28 +444,28 @@ phys_pmd_init(pmd_t *pmd, unsigned long
unsigned long pte_phys;
pte_t *pte, *pte_save;
- if (address >= end) {
- if (!after_bootmem)
- for (; i < PTRS_PER_PMD; i++, pmd++)
- set_pmd(pmd, __pmd(0));
+ if (address >= end)
break;
- }
pte = alloc_static_page(&pte_phys);
pte_save = pte;
for (k = 0; k < PTRS_PER_PTE; pte++, k++, address += PTE_SIZE) {
unsigned long pteval = address | _PAGE_NX |
_KERNPG_TABLE;
- if ((address >= end) ||
- ((address >> PAGE_SHIFT) >=
- xen_start_info->nr_pages))
+ if (address >= (after_bootmem
+ ? end
+ : xen_start_info->nr_pages <<
PAGE_SHIFT))
pteval = 0;
else if (make_readonly(address))
pteval &= ~_PAGE_RW;
- __set_pte(pte, __pte(pteval & __supported_pte_mask));
- }
- pte = pte_save;
- early_make_page_readonly(pte, XENFEAT_writable_page_tables);
- set_pmd(pmd, __pmd(pte_phys | _KERNPG_TABLE));
+ set_pte(pte, __pte(pteval & __supported_pte_mask));
+ }
+ if (!after_bootmem) {
+ early_make_page_readonly(pte_save,
XENFEAT_writable_page_tables);
+ *pmd = __pmd(pte_phys | _KERNPG_TABLE);
+ } else {
+ make_page_readonly(pte_save,
XENFEAT_writable_page_tables);
+ set_pmd(pmd, __pmd(pte_phys | _KERNPG_TABLE));
+ }
}
}
@@ -504,11 +502,13 @@ static void __meminit phys_pud_init(pud_
break;
pmd = alloc_static_page(&pmd_phys);
- early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
+
spin_lock(&init_mm.page_table_lock);
- set_pud(pud, __pud(pmd_phys | _KERNPG_TABLE));
+ *pud = __pud(pmd_phys | _KERNPG_TABLE);
phys_pmd_init(pmd, paddr, end);
spin_unlock(&init_mm.page_table_lock);
+
+ early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
}
__flush_tlb();
}
@@ -739,20 +739,18 @@ void __meminit init_memory_mapping(unsig
pgd_t *pgd = pgd_offset_k(start);
pud_t *pud;
- if (after_bootmem) {
+ if (after_bootmem)
pud = pud_offset(pgd, start & PGDIR_MASK);
- make_page_readonly(pud, XENFEAT_writable_page_tables);
- pud_phys = __pa(pud);
- } else {
+ else
pud = alloc_static_page(&pud_phys);
- early_make_page_readonly(pud,
XENFEAT_writable_page_tables);
- }
next = start + PGDIR_SIZE;
if (next > end)
next = end;
phys_pud_init(pud, __pa(start), __pa(next));
- if (!after_bootmem)
+ if (!after_bootmem) {
+ early_make_page_readonly(pud,
XENFEAT_writable_page_tables);
set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
+ }
}
if (!after_bootmem) {
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|