On Thu, Oct 18, 2012 at 01:50:24PM -0700, Yinghai Lu wrote: > On 32bit, We should not keep calling that during every init_memory_mapping.
Explain pls why. > > Need to update page_table_range_init() to count the pages for kmap page table > at first, and use new added alloc_low_pages() to get pages in sequence. > That will conform requirement that page table need to be in low to high order. ^ to the ^-s > > Signed-off-by: Yinghai Lu <ying...@kernel.org> > --- > arch/x86/mm/init.c | 13 +++++-------- > arch/x86/mm/init_32.c | 47 +++++++++++++++++++++++++++++++++++++++++------ > 2 files changed, 46 insertions(+), 14 deletions(-) > > diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c > index de71c0d..4eece3c 100644 > --- a/arch/x86/mm/init.c > +++ b/arch/x86/mm/init.c > @@ -334,14 +334,6 @@ unsigned long __init_refok init_memory_mapping(unsigned > long start, > ret = kernel_physical_mapping_init(mr[i].start, mr[i].end, > mr[i].page_size_mask); > > -#ifdef CONFIG_X86_32 > - early_ioremap_page_table_range_init(); > - > - load_cr3(swapper_pg_dir); > -#endif > - > - __flush_tlb_all(); > - > add_pfn_range_mapped(start >> PAGE_SHIFT, ret >> PAGE_SHIFT); > > return ret >> PAGE_SHIFT; > @@ -435,7 +427,12 @@ void __init init_mem_mapping(void) > /* can we preseve max_low_pfn ?*/ > max_low_pfn = max_pfn; > } > +#else > + early_ioremap_page_table_range_init(); > + load_cr3(swapper_pg_dir); > + __flush_tlb_all(); > #endif > + > early_memtest(0, max_pfn_mapped << PAGE_SHIFT); > } > > diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c > index a7f2df1..ef7f0dc 100644 > --- a/arch/x86/mm/init_32.c > +++ b/arch/x86/mm/init_32.c > @@ -135,8 +135,39 @@ pte_t * __init populate_extra_pte(unsigned long vaddr) > return one_page_table_init(pmd) + pte_idx; > } > > +static unsigned long __init > +page_table_range_init_count(unsigned long start, unsigned long end) > +{ > + unsigned long count = 0; > +#ifdef CONFIG_HIGHMEM > + int pmd_idx_kmap_begin = fix_to_virt(FIX_KMAP_END) >> PMD_SHIFT; > + int pmd_idx_kmap_end = fix_to_virt(FIX_KMAP_BEGIN) >> PMD_SHIFT; > + int pgd_idx, pmd_idx; > + unsigned long vaddr; > + > + if (pmd_idx_kmap_begin == pmd_idx_kmap_end) > + return count; Or just 'return 0'; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/