[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] linux/x86-64: initialization code cleanup
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |