Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>

---
 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;
        unsigned int i, level;
+       unsigned long ps;
 
 #ifdef CONFIG_DEBUG_PAGEALLOC
        gfp_flags = __GFP_HIGH | __GFP_NOFAIL | __GFP_NOWARN;
@@ -225,13 +226,23 @@ 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
 
        pgprot_val(ref_prot) &= ~_PAGE_NX;
-       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));
 
        /*
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to