• Catalin Marinas's avatar
    arm64: Ensure VM_WRITE|VM_SHARED ptes are clean by default · aa57157b
    Catalin Marinas authored
    Shared and writable mappings (__S.1.) should be clean (!dirty) initially
    and made dirty on a subsequent write either through the hardware DBM
    (dirty bit management) mechanism or through a write page fault. A clean
    pte for the arm64 kernel is one that has PTE_RDONLY set and PTE_DIRTY
    clear.
    
    The PAGE_SHARED{,_EXEC} attributes have PTE_WRITE set (PTE_DBM) and
    PTE_DIRTY clear. Prior to commit 73e86cb0 ("arm64: Move PTE_RDONLY
    bit handling out of set_pte_at()"), it was the responsibility of
    set_pte_at() to set the PTE_RDONLY bit and mark the pte clean if the
    software PTE_DIRTY bit was not set. However, the above commit removed
    the pte_sw_dirty() check and the subsequent setting of PTE_RDONLY in
    set_pte_at() while leaving the PAGE_SHARED{,_EXEC} definitions
    unchanged. The result is that shared+writable mappings are now dirty by
    default
    
    Fix the above by explicitly setting PTE_RDONLY in PAGE_SHARED{,_EXEC}.
    In addition, remove the superfluous PTE_DIRTY bit from the kernel PROT_*
    attributes.
    
    Fixes: 73e86cb0 ("arm64: Move PTE_RDONLY bit handling out of set_pte_at()")
    Cc: <stable@vger.kernel.org> # 4.14.x-
    Cc: Will Deacon <will@kernel.org>
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    aa57157b
pgtable-prot.h 4.32 KB