[3.13.y.z extended stable] Patch "mm: migrate: Close race between migration completion and mprotect" has been added to staging queue

Kamal Mostafa kamal at canonical.com
Thu Oct 9 20:51:50 UTC 2014

This is a note to let you know that I have just added a patch titled

    mm: migrate: Close race between migration completion and mprotect

to the linux-3.13.y-queue branch of the 3.13.y.z extended stable tree 
which can be found at:


This patch is scheduled to be released in version

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.13.y.z tree, see



>From 24cd3b3792720a2b6dfe77410d79498ebc6b5137 Mon Sep 17 00:00:00 2001
From: Mel Gorman <mgorman at suse.de>
Date: Thu, 2 Oct 2014 19:47:41 +0100
Subject: mm: migrate: Close race between migration completion and mprotect

commit d3cb8bf6081b8b7a2dabb1264fe968fd870fa595 upstream.

A migration entry is marked as write if pte_write was true at the time the
entry was created. The VMA protections are not double checked when migration
entries are being removed as mprotect marks write-migration-entries as
read. It means that potentially we take a spurious fault to mark PTEs write
again but it's straight-forward. However, there is a race between write
migrations being marked read and migrations finishing. This potentially
allows a PTE to be write that should have been read. Close this race by
double checking the VMA permissions using maybe_mkwrite when migration

[torvalds at linux-foundation.org: use maybe_mkwrite]
Signed-off-by: Mel Gorman <mgorman at suse.de>
Acked-by: Rik van Riel <riel at redhat.com>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
Signed-off-by: Kamal Mostafa <kamal at canonical.com>
 mm/migrate.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/mm/migrate.c b/mm/migrate.c
index 9194375..62047f8 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -164,8 +164,11 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma,
 	pte = pte_mkold(mk_pte(new, vma->vm_page_prot));
 	if (pte_swp_soft_dirty(*ptep))
 		pte = pte_mksoft_dirty(pte);
+	/* Recheck VMA as permissions can change since migration started  */
 	if (is_write_migration_entry(entry))
-		pte = pte_mkwrite(pte);
+		pte = maybe_mkwrite(pte, vma);
 	if (PageHuge(new)) {
 		pte = pte_mkhuge(pte);

More information about the kernel-team mailing list