diff options
Diffstat (limited to 'mm/migrate.c')
-rw-r--r-- | mm/migrate.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/mm/migrate.c b/mm/migrate.c index 568284ec75d4..fdaf0818fb30 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -1773,7 +1773,10 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | |||
1773 | put_page(new_page); | 1773 | put_page(new_page); |
1774 | goto out_fail; | 1774 | goto out_fail; |
1775 | } | 1775 | } |
1776 | 1776 | /* | |
1777 | * We are not sure a pending tlb flush here is for a huge page | ||
1778 | * mapping or not. Hence use the tlb range variant | ||
1779 | */ | ||
1777 | if (mm_tlb_flush_pending(mm)) | 1780 | if (mm_tlb_flush_pending(mm)) |
1778 | flush_tlb_range(vma, mmun_start, mmun_end); | 1781 | flush_tlb_range(vma, mmun_start, mmun_end); |
1779 | 1782 | ||
@@ -1829,12 +1832,11 @@ fail_putback: | |||
1829 | page_add_anon_rmap(new_page, vma, mmun_start, true); | 1832 | page_add_anon_rmap(new_page, vma, mmun_start, true); |
1830 | pmdp_huge_clear_flush_notify(vma, mmun_start, pmd); | 1833 | pmdp_huge_clear_flush_notify(vma, mmun_start, pmd); |
1831 | set_pmd_at(mm, mmun_start, pmd, entry); | 1834 | set_pmd_at(mm, mmun_start, pmd, entry); |
1832 | flush_tlb_range(vma, mmun_start, mmun_end); | ||
1833 | update_mmu_cache_pmd(vma, address, &entry); | 1835 | update_mmu_cache_pmd(vma, address, &entry); |
1834 | 1836 | ||
1835 | if (page_count(page) != 2) { | 1837 | if (page_count(page) != 2) { |
1836 | set_pmd_at(mm, mmun_start, pmd, orig_entry); | 1838 | set_pmd_at(mm, mmun_start, pmd, orig_entry); |
1837 | flush_tlb_range(vma, mmun_start, mmun_end); | 1839 | flush_pmd_tlb_range(vma, mmun_start, mmun_end); |
1838 | mmu_notifier_invalidate_range(mm, mmun_start, mmun_end); | 1840 | mmu_notifier_invalidate_range(mm, mmun_start, mmun_end); |
1839 | update_mmu_cache_pmd(vma, address, &entry); | 1841 | update_mmu_cache_pmd(vma, address, &entry); |
1840 | page_remove_rmap(new_page, true); | 1842 | page_remove_rmap(new_page, true); |