• Steve Capper's avatar
    arm64: mm: Fix pte_mkclean, pte_mkdirty semantics · 8781bcbc
    Steve Capper authored
    On systems with hardware dirty bit management, the ltp madvise09 unit
    test fails due to dirty bit information being lost and pages being
    incorrectly freed.
    
    This was bisected to:
    	arm64: Ignore hardware dirty bit updates in ptep_set_wrprotect()
    
    Reverting this commit leads to a separate problem, that the unit test
    retains pages that should have been dropped due to the function
    madvise_free_pte_range(.) not cleaning pte's properly.
    
    Currently pte_mkclean only clears the software dirty bit, thus the
    following code sequence can appear:
    
    	pte = pte_mkclean(pte);
    	if (pte_dirty(pte))
    		// this condition can return true with HW DBM!
    
    This patch also adjusts pte_mkclean to set PTE_RDONLY thus effectively
    clearing both the SW and HW dirty information.
    
    In order for this to function on systems without HW DBM, we need to
    also adjust pte_mkdirty to remove the read only bit from writable pte's
    to avoid infinite fault loops.
    
    Cc: <stable@vger.kernel.org>
    Fixes: 64c26841 ("arm64: Ignore hardware dirty bit updates in ptep_set_wrprotect()")
    Reported-by: default avatarBhupinder Thakur <bhupinder.thakur@linaro.org>
    Tested-by: default avatarBhupinder Thakur <bhupinder.thakur@linaro.org>
    Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarSteve Capper <steve.capper@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    8781bcbc
pgtable.h 21.7 KB