diff options
Diffstat (limited to 'fs/proc/task_mmu.c')
| -rw-r--r-- | fs/proc/task_mmu.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index f08bd31c1081..312578089544 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -900,7 +900,14 @@ static inline void clear_soft_dirty(struct vm_area_struct *vma,  static inline void clear_soft_dirty_pmd(struct vm_area_struct *vma,  		unsigned long addr, pmd_t *pmdp)  { -	pmd_t pmd = pmdp_huge_get_and_clear(vma->vm_mm, addr, pmdp); +	pmd_t pmd = *pmdp; + +	/* See comment in change_huge_pmd() */ +	pmdp_invalidate(vma, addr, pmdp); +	if (pmd_dirty(*pmdp)) +		pmd = pmd_mkdirty(pmd); +	if (pmd_young(*pmdp)) +		pmd = pmd_mkyoung(pmd);  	pmd = pmd_wrprotect(pmd);  	pmd = pmd_clear_soft_dirty(pmd);  | 
