THP migration can fail for a variety of reasons. Avoid flushing the TLB
to deal with THP migration races until the copy is ready to start.

Cc: sta...@vger.kernel.org
Signed-off-by: Mel Gorman <mgor...@suse.de>
---
 mm/huge_memory.c | 7 -------
 mm/migrate.c     | 6 ++++++
 2 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index e3a5ee2..e3b6a75 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1377,13 +1377,6 @@ int do_huge_pmd_numa_page(struct mm_struct *mm, struct 
vm_area_struct *vma,
        }
 
        /*
-        * The page_table_lock above provides a memory barrier
-        * with change_protection_range.
-        */
-       if (tlb_flush_pending(mm))
-               flush_tlb_range(vma, haddr, haddr + HPAGE_PMD_SIZE);
-
-       /*
         * Migrate the THP to the requested node, returns with page unlocked
         * and pmd_numa cleared.
         */
diff --git a/mm/migrate.c b/mm/migrate.c
index cfb4190..5372521 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1759,6 +1759,12 @@ int migrate_misplaced_transhuge_page(struct mm_struct 
*mm,
                goto out_fail;
        }
 
+       /* PTL provides a memory barrier with change_protection_range */
+       ptl = pmd_lock(mm, pmd);
+       if (tlb_flush_pending(mm))
+               flush_tlb_range(vma, mmun_start, mmun_end);
+       spin_unlock(ptl);
+
        /* Prepare a page as a migration target */
        __set_page_locked(new_page);
        SetPageSwapBacked(new_page);
-- 
1.8.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to