Re: [PATCH 1/3] mm: clearing pte in clear_soft_dirty()
From: Aneesh Kumar K.V <hidden>
Date: 2015-10-17 12:12:57
Also in:
linux-mm, lkml
Laurent Dufour [off-list ref] writes:
As mentioned in the commit 56eecdb912b5 ("mm: Use ptep/pmdp_set_numa()
for updating _PAGE_NUMA bit"), architecture like ppc64 doesn't do
tlb flush in set_pte/pmd functions.
So when dealing with existing pte in clear_soft_dirty, the pte must
be cleared before being modified.
Signed-off-by: Laurent Dufour <redacted>
CC: Aneesh Kumar K.V <redacted>Reviewed-by: Aneesh Kumar K.V <redacted>
quoted hunk ↗ jump to hunk
--- fs/proc/task_mmu.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index e2d46adb54b4..c9454ee39b28 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c@@ -753,19 +753,20 @@ static inline void clear_soft_dirty(struct vm_area_struct *vma, pte_t ptent = *pte; if (pte_present(ptent)) { + ptent = ptep_modify_prot_start(vma->vm_mm, addr, pte); ptent = pte_wrprotect(ptent); ptent = pte_clear_flags(ptent, _PAGE_SOFT_DIRTY); + ptep_modify_prot_commit(vma->vm_mm, addr, pte, ptent); } else if (is_swap_pte(ptent)) { ptent = pte_swp_clear_soft_dirty(ptent); + set_pte_at(vma->vm_mm, addr, pte, ptent); } - - set_pte_at(vma->vm_mm, addr, pte, ptent); } static inline void clear_soft_dirty_pmd(struct vm_area_struct *vma, unsigned long addr, pmd_t *pmdp) { - pmd_t pmd = *pmdp; + pmd_t pmd = pmdp_huge_get_and_clear(vma->vm_mm, addr, pmdp); pmd = pmd_wrprotect(pmd); pmd = pmd_clear_flags(pmd, _PAGE_SOFT_DIRTY);-- 1.9.1