|
@@ -1773,7 +1773,10 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm,
|
|
|
put_page(new_page);
|
|
|
goto out_fail;
|
|
|
}
|
|
|
-
|
|
|
+ /*
|
|
|
+ * We are not sure a pending tlb flush here is for a huge page
|
|
|
+ * mapping or not. Hence use the tlb range variant
|
|
|
+ */
|
|
|
if (mm_tlb_flush_pending(mm))
|
|
|
flush_tlb_range(vma, mmun_start, mmun_end);
|
|
|
|
|
@@ -1829,12 +1832,11 @@ fail_putback:
|
|
|
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);
|
|
|
- flush_tlb_range(vma, mmun_start, mmun_end);
|
|
|
update_mmu_cache_pmd(vma, address, &entry);
|
|
|
|
|
|
if (page_count(page) != 2) {
|
|
|
set_pmd_at(mm, mmun_start, pmd, orig_entry);
|
|
|
- flush_tlb_range(vma, mmun_start, mmun_end);
|
|
|
+ flush_pmd_tlb_range(vma, mmun_start, mmun_end);
|
|
|
mmu_notifier_invalidate_range(mm, mmun_start, mmun_end);
|
|
|
update_mmu_cache_pmd(vma, address, &entry);
|
|
|
page_remove_rmap(new_page, true);
|