lkml.org 
[lkml]   [2016]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.2.y-ckt 066/206] arm64: Ensure pmd_present() returns false after pmd_mknotpresent()
    Date
    4.2.8-ckt12 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    From: Catalin Marinas <catalin.marinas@arm.com>

    commit 5bb1cc0ff9a6b68871970737e6c4c16919928d8b upstream.

    Currently, pmd_present() only checks for a non-zero value, returning
    true even after pmd_mknotpresent() (which only clears the type bits).
    This patch converts pmd_present() to using pte_present(), similar to the
    other pmd_*() checks. As a side effect, it will return true for
    PROT_NONE mappings, though they are not yet used by the kernel with
    transparent huge pages.

    For consistency, also change pmd_mknotpresent() to only clear the
    PMD_SECT_VALID bit, even though the PMD_TABLE_BIT is already 0 for block
    mappings (no functional change). The unused PMD_SECT_PROT_NONE
    definition is removed as transparent huge pages use the pte page prot
    values.

    Fixes: 9c7e535fcc17 ("arm64: mm: Route pmd thp functions through pte equivalents")
    Reviewed-by: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    arch/arm64/include/asm/pgtable-hwdef.h | 1 -
    arch/arm64/include/asm/pgtable.h | 4 ++--
    2 files changed, 2 insertions(+), 3 deletions(-)

    diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h
    index 59bfae7..d007a7b 100644
    --- a/arch/arm64/include/asm/pgtable-hwdef.h
    +++ b/arch/arm64/include/asm/pgtable-hwdef.h
    @@ -77,7 +77,6 @@
    * Section
    */
    #define PMD_SECT_VALID (_AT(pmdval_t, 1) << 0)
    -#define PMD_SECT_PROT_NONE (_AT(pmdval_t, 1) << 58)
    #define PMD_SECT_USER (_AT(pmdval_t, 1) << 6) /* AP[1] */
    #define PMD_SECT_RDONLY (_AT(pmdval_t, 1) << 7) /* AP[2] */
    #define PMD_SECT_S (_AT(pmdval_t, 3) << 8)
    diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
    index 526a9cb..f1fc314 100644
    --- a/arch/arm64/include/asm/pgtable.h
    +++ b/arch/arm64/include/asm/pgtable.h
    @@ -285,6 +285,7 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address,
    #endif /* CONFIG_HAVE_RCU_TABLE_FREE */
    #endif /* CONFIG_TRANSPARENT_HUGEPAGE */

    +#define pmd_present(pmd) pte_present(pmd_pte(pmd))
    #define pmd_dirty(pmd) pte_dirty(pmd_pte(pmd))
    #define pmd_young(pmd) pte_young(pmd_pte(pmd))
    #define pmd_wrprotect(pmd) pte_pmd(pte_wrprotect(pmd_pte(pmd)))
    @@ -293,7 +294,7 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address,
    #define pmd_mkwrite(pmd) pte_pmd(pte_mkwrite(pmd_pte(pmd)))
    #define pmd_mkdirty(pmd) pte_pmd(pte_mkdirty(pmd_pte(pmd)))
    #define pmd_mkyoung(pmd) pte_pmd(pte_mkyoung(pmd_pte(pmd)))
    -#define pmd_mknotpresent(pmd) (__pmd(pmd_val(pmd) & ~PMD_TYPE_MASK))
    +#define pmd_mknotpresent(pmd) (__pmd(pmd_val(pmd) & ~PMD_SECT_VALID))

    #define __HAVE_ARCH_PMD_WRITE
    #define pmd_write(pmd) pte_write(pmd_pte(pmd))
    @@ -332,7 +333,6 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
    unsigned long size, pgprot_t vma_prot);

    #define pmd_none(pmd) (!pmd_val(pmd))
    -#define pmd_present(pmd) (pmd_val(pmd))

    #define pmd_bad(pmd) (!(pmd_val(pmd) & 2))

    --
    2.7.4
    \
     
     \ /
      Last update: 2016-06-10 00:41    [W:4.017 / U:0.324 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site