diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/mm/memory.c b/mm/memory.c index 221fc9ffcab1..765377385632 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -3537,8 +3537,9 @@ retry: | |||
3537 | 3537 | ||
3538 | barrier(); | 3538 | barrier(); |
3539 | if (pmd_trans_huge(orig_pmd)) { | 3539 | if (pmd_trans_huge(orig_pmd)) { |
3540 | if (flags & FAULT_FLAG_WRITE && | 3540 | unsigned int dirty = flags & FAULT_FLAG_WRITE; |
3541 | !pmd_write(orig_pmd) && | 3541 | |
3542 | if (dirty && !pmd_write(orig_pmd) && | ||
3542 | !pmd_trans_splitting(orig_pmd)) { | 3543 | !pmd_trans_splitting(orig_pmd)) { |
3543 | ret = do_huge_pmd_wp_page(mm, vma, address, pmd, | 3544 | ret = do_huge_pmd_wp_page(mm, vma, address, pmd, |
3544 | orig_pmd); | 3545 | orig_pmd); |
@@ -3550,6 +3551,9 @@ retry: | |||
3550 | if (unlikely(ret & VM_FAULT_OOM)) | 3551 | if (unlikely(ret & VM_FAULT_OOM)) |
3551 | goto retry; | 3552 | goto retry; |
3552 | return ret; | 3553 | return ret; |
3554 | } else { | ||
3555 | huge_pmd_set_accessed(mm, vma, address, pmd, | ||
3556 | orig_pmd, dirty); | ||
3553 | } | 3557 | } |
3554 | return 0; | 3558 | return 0; |
3555 | } | 3559 | } |