Patchwork [3.5.y.z,extended,stable] Patch "mm compaction: fix of improper cache flush in migration code" has been added to staging queue

mail settings
Submitter Luis Henriques
Date May 28, 2013, 9:51 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/246816/
State New
Headers show


Luis Henriques - May 28, 2013, 9:51 a.m.
This is a note to let you know that I have just added a patch titled

    mm compaction: fix of improper cache flush in migration code

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

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.5.y.z tree, see



From a2827fda45795970f4d2b41db650dd51e334852c Mon Sep 17 00:00:00 2001
From: Leonid Yegoshin <>
Date: Fri, 24 May 2013 15:55:18 -0700
Subject: [PATCH] mm compaction: fix of improper cache flush in migration code

commit c2cc499c5bcf9040a738f49e8051b42078205748 upstream.

Page 'new' during MIGRATION can't be flushed with flush_cache_page().
Using flush_cache_page(vma, addr, pfn) is justified only if the page is
already placed in process page table, and that is done right after
flush_cache_page().  But without it the arch function has no knowledge
of process PTE and does nothing.

Besides that, flush_cache_page() flushes an application cache page, but
the kernel has a different page virtual address and dirtied it.

Replace it with flush_dcache_page(new) which is the proper usage.

The old page is flushed in try_to_unmap_one() before migration.

This bug takes place in Sead3 board with M14Kc MIPS CPU without cache
aliasing (but Harvard arch - separate I and D cache) in tight memory
environment (128MB) each 1-3days on SOAK test.  It fails in cc1 during
kernel build (SIGILL, SIGBUS, SIGSEG) if CONFIG_COMPACTION is switched

Signed-off-by: Leonid Yegoshin <>
Cc: Leonid Yegoshin <>
Acked-by: Rik van Riel <>
Cc: Michal Hocko <>
Acked-by: Mel Gorman <>
Cc: Ralf Baechle <>
Cc: Russell King <>
Cc: David Miller <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>
Signed-off-by: Luis Henriques <>
 mm/migrate.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)



diff --git a/mm/migrate.c b/mm/migrate.c
index 2e03986..65cc229 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -147,7 +147,7 @@  static int remove_migration_pte(struct page *new, struct vm_area_struct *vma,
 		pte = arch_make_huge_pte(pte, vma, new, 0);
-	flush_cache_page(vma, addr, pte_pfn(pte));
+	flush_dcache_page(new);
 	set_pte_at(mm, addr, ptep, pte);

 	if (PageHuge(new)) {