From: jbeulich@xxxxxxxxxx Subject: Unmap temporary mappings established for setup of 1:1 mappings. References: 175787 Index: head-2006-05-26/arch/x86_64/mm/init-xen.c =================================================================== --- head-2006-05-26.orig/arch/x86_64/mm/init-xen.c 2006-05-31 14:23:51.000000000 +0200 +++ head-2006-05-26/arch/x86_64/mm/init-xen.c 2006-05-31 14:30:12.000000000 +0200 @@ -56,6 +56,8 @@ struct dma_mapping_ops* dma_ops; EXPORT_SYMBOL(dma_ops); +int after_bootmem; + extern unsigned long *contiguous_bitmap; #ifndef CONFIG_XEN @@ -76,7 +78,7 @@ extern unsigned long start_pfn; (((mfn_to_pfn((addr) >> PAGE_SHIFT)) << PAGE_SHIFT) + \ __START_KERNEL_map))) -static void early_make_page_readonly(void *va, unsigned int feature) +static void __meminit early_make_page_readonly(void *va, unsigned int feature) { unsigned long addr, _va = (unsigned long)va; pte_t pte, *ptep; @@ -85,6 +87,11 @@ static void early_make_page_readonly(voi if (xen_feature(feature)) return; + if (after_bootmem) { + make_page_readonly(va, feature); + return; + } + addr = (unsigned long) page[pgd_index(_va)]; addr_to_page(addr, page); @@ -200,10 +207,6 @@ void show_mem(void) printk(KERN_INFO "%lu pages swap cached\n",cached); } -/* References to section boundaries */ - -int after_bootmem; - static void *spp_getpage(void) { void *ptr; @@ -372,7 +375,8 @@ void __set_fixmap_user (enum fixed_addre set_pte_phys(address, phys, prot, SET_FIXMAP_USER); } -unsigned long __initdata table_start, tables_space; +unsigned long __initdata table_start; +static unsigned long __initdata tables_space; unsigned long get_machine_pfn(unsigned long addr) { @@ -444,9 +448,9 @@ phys_pmd_init(pmd_t *pmd, unsigned long pte = alloc_static_page(&pte_phys); pte_save = pte; for (k = 0; k < PTRS_PER_PTE; pte++, k++, address += PTE_SIZE) { - if ((address >= end) || - ((address >> PAGE_SHIFT) >= - xen_start_info->nr_pages)) { + if (address >= (after_bootmem + ? end + : xen_start_info->nr_pages << PAGE_SHIFT)) { __set_pte(pte, __pte(0)); continue; } @@ -546,7 +550,7 @@ void __init xen_init_pt(void) mk_kernel_pgd(__pa_symbol(level3_user_pgt))); } -void __init extend_init_mapping(void) +static void __init extend_init_mapping(void) { unsigned long va = __START_KERNEL_map; unsigned long phys, addr, *pte_page; @@ -617,7 +621,8 @@ static void __init find_early_table_spac table_start = start_pfn; early_printk("kernel direct mapping tables up to %lx @ %lx-%lx\n", - end, table_start << PAGE_SHIFT, start_pfn << PAGE_SHIFT); + end, table_start << PAGE_SHIFT, + (table_start << PAGE_SHIFT) + tables_space); } /* Setup the direct mapping of the physical memory at PAGE_OFFSET. @@ -662,7 +667,18 @@ void __meminit init_memory_mapping(unsig set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys)); } - BUG_ON(!after_bootmem && start_pfn != table_start + (tables_space >> PAGE_SHIFT)); + if (!after_bootmem) { + BUG_ON(start_pfn != table_start + (tables_space >> PAGE_SHIFT)); + + /* Destroy the temporary mappings created above. */ + start = __START_KERNEL_map + (table_start << PAGE_SHIFT); + end = start + tables_space; + for (; start < end; start += PAGE_SIZE) { + /* Should also clear out and reclaim any page table + pages no longer needed... */ + WARN_ON(HYPERVISOR_update_va_mapping(start, __pte_ma(0), 0)); + } + } __flush_tlb_all(); }