• Catalin Marinas's avatar
    arm64: Fix potential race with hardware DBM in ptep_set_access_flags() · 6d332747
    Catalin Marinas authored
    In a system with DBM (dirty bit management) capable agents there is a
    possible race between a CPU executing ptep_set_access_flags() (maybe
    non-DBM capable) and a hardware update of the dirty state (clearing of
    PTE_RDONLY). The scenario:
    
    a) the pte is writable (PTE_WRITE set), clean (PTE_RDONLY set) and old
       (PTE_AF clear)
    b) ptep_set_access_flags() is called as a result of a read access and it
       needs to set the pte to writable, clean and young (PTE_AF set)
    c) a DBM-capable agent, as a result of a different write access, is
       marking the entry as young (setting PTE_AF) and dirty (clearing
       PTE_RDONLY)
    
    The current ptep_set_access_flags() implementation would set the
    PTE_RDONLY bit in the resulting value overriding the DBM update and
    losing the dirty state.
    
    This patch fixes such race by setting PTE_RDONLY to the most permissive
    (lowest value) of the current entry and the new one.
    
    Fixes: 66dbd6e6 ("arm64: Implement ptep_set_access_flags() for hardware AF/DBM")
    Cc: Will Deacon <will.deacon@arm.com>
    Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarSteve Capper <steve.capper@arm.com>
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    6d332747
fault.c 22.2 KB