From: Andi Kleen Date: Wed, 30 Jan 2008 12:33:52 +0000 (+0100) Subject: x86: c_p_a() make it more robust against use of PAT bits X-Git-Tag: v2.6.25-rc1~1143^2~112 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=895bdc29956e5c9e9e101b2b1c2f0ed34130f945;p=linux-2.6 x86: c_p_a() make it more robust against use of PAT bits Use the page table level instead of the PSE bit to check if the PTE is for a 4K page or not. This makes the code more robust when the PAT bit is changed because the PAT bit on 4K pages is in the same position as the PSE bit. Signed-off-by: Andi Kleen Acked-by: Jan Beulich Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner --- diff --git a/arch/x86/mm/pageattr_32.c b/arch/x86/mm/pageattr_32.c index 5cb5c7101f..66688a6308 100644 --- a/arch/x86/mm/pageattr_32.c +++ b/arch/x86/mm/pageattr_32.c @@ -172,7 +172,7 @@ static int __change_page_attr(struct page *page, pgprot_t prot) BUG_ON(PageCompound(kpte_page)); if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL)) { - if (!pte_huge(*kpte)) { + if (level == 3) { set_pte_atomic(kpte, mk_pte(page, prot)); } else { struct page *split; @@ -190,7 +190,7 @@ static int __change_page_attr(struct page *page, pgprot_t prot) } page_private(kpte_page)++; } else { - if (!pte_huge(*kpte)) { + if (level == 3) { set_pte_atomic(kpte, mk_pte(page, PAGE_KERNEL)); BUG_ON(page_private(kpte_page) == 0); page_private(kpte_page)--; diff --git a/arch/x86/mm/pageattr_64.c b/arch/x86/mm/pageattr_64.c index 3ccdb1401e..73dbbb4048 100644 --- a/arch/x86/mm/pageattr_64.c +++ b/arch/x86/mm/pageattr_64.c @@ -153,7 +153,7 @@ __change_page_attr(unsigned long address, unsigned long pfn, pgprot_t prot, BUG_ON(PageLRU(kpte_page)); BUG_ON(PageCompound(kpte_page)); if (pgprot_val(prot) != pgprot_val(ref_prot)) { - if (!pte_huge(*kpte)) { + if (level == 4) { set_pte(kpte, pfn_pte(pfn, prot)); } else { /* @@ -172,7 +172,7 @@ __change_page_attr(unsigned long address, unsigned long pfn, pgprot_t prot, } page_private(kpte_page)++; } else { - if (!pte_huge(*kpte)) { + if (level == 4) { set_pte(kpte, pfn_pte(pfn, ref_prot)); BUG_ON(page_private(kpte_page) == 0); page_private(kpte_page)--;