Mark the VMA touched when policy changes are applied to it so that
speculative page fault will be aborted.

Signed-off-by: Laurent Dufour <[email protected]>
---
 mm/mempolicy.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 13d32c25226c..5e44b3e69a0d 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -447,8 +447,11 @@ void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new)
        struct vm_area_struct *vma;
 
        down_write(&mm->mmap_sem);
-       for (vma = mm->mmap; vma; vma = vma->vm_next)
+       for (vma = mm->mmap; vma; vma = vma->vm_next) {
+               write_seqcount_begin(&vma->vm_sequence);
                mpol_rebind_policy(vma->vm_policy, new, MPOL_REBIND_ONCE);
+               write_seqcount_end(&vma->vm_sequence);
+       }
        up_write(&mm->mmap_sem);
 }
 
@@ -711,6 +714,7 @@ static int vma_replace_policy(struct vm_area_struct *vma,
        if (IS_ERR(new))
                return PTR_ERR(new);
 
+       write_seqcount_begin(&vma->vm_sequence);
        if (vma->vm_ops && vma->vm_ops->set_policy) {
                err = vma->vm_ops->set_policy(vma, new);
                if (err)
@@ -719,10 +723,12 @@ static int vma_replace_policy(struct vm_area_struct *vma,
 
        old = vma->vm_policy;
        vma->vm_policy = new; /* protected by mmap_sem */
+       write_seqcount_end(&vma->vm_sequence);
        mpol_put(old);
 
        return 0;
  err_out:
+       write_seqcount_end(&vma->vm_sequence);
        mpol_put(new);
        return err;
 }
-- 
2.7.4

Reply via email to