x86 mm init cleanup
PATCH 1/1 x86 mm init cleanup
Patch against test11. This patch moves the setting of %cr4 out of the loops and makes the code a bit more readable. Tested with standard pagetables, PSE, and PAE.
Signature · 1 line
Brian Gerst
arch/i386/mm/init.c +29 -28
@@ -315,7 +315,7 @@static void __init pagetable_init (void ) { -unsigned long vaddr, end; +unsigned long vaddr, end, __pe;pgd_t *pgd, *pgd_base;int i, j, k;pmd_t *pmd;
@@ -334,11 +334,23 @@ __pgd_clear(pgd); }#endif - i =__pgd_offset (PAGE_OFFSET ); + + __pe = _KERNPG_TABLE; +if (cpu_has_pse) { +set_in_cr4 (X86_CR4_PSE ); + __pe += _PAGE_PSE; + boot_cpu_data.wp_works_ok =1 ; +if (cpu_has_pge) { +set_in_cr4 (X86_CR4_PGE ); + __pe += _PAGE_GLOBAL; + } + } + + vaddr =PAGE_OFFSET ; + i =__pgd_offset (vaddr); pgd = pgd_base + i;for (; i <PTRS_PER_PGD ; pgd++, i++) { - vaddr = i*PGDIR_SIZE ;if (end && (vaddr >= end))break ;#if CONFIG_X86_PAE
@@ -350,35 +362,24 @@if (pmd !=pmd_offset (pgd,0 ))BUG ();for (j =0 ; j <PTRS_PER_PMD ; pmd++, j++) { - vaddr = i*PGDIR_SIZE + j*PMD_SIZE ;if (end && (vaddr >= end))break ;if (cpu_has_pse) { -unsigned long __pe; - -set_in_cr4 (X86_CR4_PSE ); - boot_cpu_data.wp_works_ok =1 ; - __pe = _KERNPG_TABLE + _PAGE_PSE +__pa (vaddr); -/* Make it "global" too if supported */ -if (cpu_has_pge) { -set_in_cr4 (X86_CR4_PGE ); - __pe += _PAGE_GLOBAL; +set_pmd (pmd,__pmd (__pe +__pa (vaddr))); + vaddr +=PMD_SIZE ; + }else { + pte = (pte_t *)alloc_bootmem_low_pages (PAGE_SIZE ); +set_pmd (pmd,__pmd (__pe +__pa (pte))); + +if (pte !=pte_offset (pmd,0 )) +BUG (); + +for (k =0 ; k <PTRS_PER_PTE ; pte++, k++) { +if (end && (vaddr >= end)) +break ; + *pte =mk_pte_phys (__pa (vaddr),PAGE_KERNEL ); + vaddr +=PAGE_SIZE ; } -set_pmd (pmd,__pmd (__pe)); -continue ; - } - - pte = (pte_t *)alloc_bootmem_low_pages (PAGE_SIZE ); -set_pmd (pmd,__pmd (_KERNPG_TABLE +__pa (pte))); - -if (pte !=pte_offset (pmd,0 )) -BUG (); - -for (k =0 ; k <PTRS_PER_PTE ; pte++, k++) { - vaddr = i*PGDIR_SIZE + j*PMD_SIZE + k*PAGE_SIZE ; -if (end && (vaddr >= end)) -break ; - *pte =mk_pte_phys (__pa (vaddr),PAGE_KERNEL ); } } }
Quoted 5 lines · Brian Gerst
Patch against test11. This patch moves the setting of %cr4 out of the loops and makes the code a bit more readable. Tested with standard pagetables, PSE, and PAE.
Brian,
while you were there, so close to paging_init() why not also correct the wrong comment at the top of the function? It talks about 0-4M pagetables whereas we really setup (see head.S) 0-8M.
Regards,
Tigran
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/
Quoted 9 lines · Tigran Aivazian
Quoted 5 lines · Brian Gerst
Patch against test11. This patch moves the setting of %cr4 out of the loops and makes the code a bit more readable. Tested with standard pagetables, PSE, and PAE.
Quoted 8 lines
Brian,
while you were there, so close to
paging_init()why not also correct the wrong comment at the top of the function? It talks about 0-4M pagetables whereas we really setup (seehead.S) 0-8M.Regards,
Tigran
Add this little patch then
Signature · 1 line
Brian Gerst
arch/i386/mm/init.c +1 -1
@@ -437,7 +437,7 @@ }/* -* paging_init() sets up the page tables - note that the first 4MB are +* paging_init() sets up the page tables - note that the first 8MB are * already mapped by head.S. * * This routines also unmaps the page at virtual kernel address 0, so