Messages in this thread Patch in this message | | | From | Andi Kleen <> | Subject | [PATCH] [8/9] GBPAGES: Implement gbpages support in change_page_attr() | Date | Tue, 29 Jan 2008 06:06:36 +0100 (CET) |
| |
Signed-off-by: Andi Kleen <ak@suse.de>
--- arch/x86/mm/pageattr.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
Index: linux/arch/x86/mm/pageattr.c =================================================================== --- linux.orig/arch/x86/mm/pageattr.c +++ linux/arch/x86/mm/pageattr.c @@ -203,6 +203,7 @@ static int split_large_page(pte_t *kpte, pte_t *pbase, *tmp; struct page *base; int i, level; + unsigned long ps; #ifdef CONFIG_DEBUG_PAGEALLOC gfp_flags = GFP_ATOMIC; @@ -224,12 +225,22 @@ static int split_large_page(pte_t *kpte, address = __pa(address); addr = address & PMD_PAGE_MASK; + + ps = PAGE_SIZE; +#ifdef CONFIG_X86_64 + if (level == PG_LEVEL_1G) { + ps = PMD_PAGE_SIZE; + pgprot_val(ref_prot) |= _PAGE_PSE; + addr &= PUD_PAGE_MASK; + } +#endif + pbase = (pte_t *)page_address(base); #ifdef CONFIG_X86_32 paravirt_alloc_pt(&init_mm, page_to_pfn(base)); #endif - for (i = 0; i < PTRS_PER_PTE; i++, addr += PAGE_SIZE) + for (i = 0; i < PTRS_PER_PTE; i++, addr += ps) set_pte(&pbase[i], pfn_pte(addr >> PAGE_SHIFT, ref_prot)); /*
| |