On Mon, 15 Oct 2018 16:23:11 -0400 Andrea Arcangeli <aarcange@xxxxxxxxxx> wrote: > There should be no cache left by the time we overwrite the old > transhuge pmd with the new one. It's already too late to flush through > the virtual address because we already copied the page data to the new > physical address. > > So flush the cache before the data copy. > > Also delete the "end" variable to shutoff a "unused variable" warning > on x86 where flush_cache_range() is a noop. migrate_misplaced_transhuge_page() has changed a bit. This is how I figure the patch should be. Please check: --- a/mm/migrate.c~mm-thp-relocate-flush_cache_range-in-migrate_misplaced_transhuge_page +++ a/mm/migrate.c @@ -1999,6 +1999,8 @@ int migrate_misplaced_transhuge_page(str /* anon mapping, we can simply copy page->mapping to the new page: */ new_page->mapping = page->mapping; new_page->index = page->index; + /* flush the cache before copying using the kernel virtual address */ + flush_cache_range(vma, mmun_start, mmun_end); migrate_page_copy(new_page, page); WARN_ON(PageLRU(new_page)); @@ -2037,7 +2039,6 @@ int migrate_misplaced_transhuge_page(str * The SetPageUptodate on the new page and page_add_new_anon_rmap * guarantee the copy is visible before the pagetable update. */ - flush_cache_range(vma, mmun_start, mmun_end); page_add_anon_rmap(new_page, vma, mmun_start, true); pmdp_huge_clear_flush_notify(vma, mmun_start, pmd); set_pmd_at(mm, mmun_start, pmd, entry); _