lkml.org 
[lkml]   [2008]   [Jan]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH CPA] [18/28] CPA: Make change_page_attr() more robust against use of PAT bits
    Date

    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 <ak@suse.de>

    ---
    arch/x86/mm/pageattr_32.c | 4 ++--
    arch/x86/mm/pageattr_64.c | 4 ++--
    2 files changed, 4 insertions(+), 4 deletions(-)

    Index: linux/arch/x86/mm/pageattr_32.c
    ===================================================================
    --- linux.orig/arch/x86/mm/pageattr_32.c
    +++ linux/arch/x86/mm/pageattr_32.c
    @@ -209,7 +209,7 @@ __change_page_attr(struct page *page, pg
    set_tlb_flush(address);

    if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL)) {
    - if (!pte_huge(*kpte)) {
    + if (level == 3) {
    set_pte_atomic(kpte, mk_pte(page, prot));
    } else {
    pgprot_t ref_prot;
    @@ -225,7 +225,7 @@ __change_page_attr(struct page *page, pg
    kpte_page = split;
    }
    page_private(kpte_page)++;
    - } else if (!pte_huge(*kpte)) {
    + } else if (level == 3) {
    set_pte_atomic(kpte, mk_pte(page, PAGE_KERNEL));
    BUG_ON(page_private(kpte_page) == 0);
    page_private(kpte_page)--;
    Index: linux/arch/x86/mm/pageattr_64.c
    ===================================================================
    --- linux.orig/arch/x86/mm/pageattr_64.c
    +++ linux/arch/x86/mm/pageattr_64.c
    @@ -184,7 +184,7 @@ __change_page_attr(unsigned long address
    set_tlb_flush(address);

    if (pgprot_val(prot) != pgprot_val(ref_prot)) {
    - if (!pte_huge(*kpte)) {
    + if (level == 4) {
    set_pte(kpte, pfn_pte(pfn, prot));
    } else {
    /*
    @@ -201,7 +201,7 @@ __change_page_attr(unsigned long address
    kpte_page = split;
    }
    page_private(kpte_page)++;
    - } else if (!pte_huge(*kpte)) {
    + } else if (level == 4) {
    set_pte(kpte, pfn_pte(pfn, ref_prot));
    BUG_ON(page_private(kpte_page) == 0);
    page_private(kpte_page)--;

    \
     
     \ /
      Last update: 2008-01-03 16:35    [W:0.021 / U:2.344 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site