diff options
Diffstat (limited to 'mm/migrate.c')
-rw-r--r-- | mm/migrate.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/mm/migrate.c b/mm/migrate.c index a26bccd44ccb..c04692774e88 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -161,6 +161,8 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma, | |||
161 | 161 | ||
162 | get_page(new); | 162 | get_page(new); |
163 | pte = pte_mkold(mk_pte(new, vma->vm_page_prot)); | 163 | pte = pte_mkold(mk_pte(new, vma->vm_page_prot)); |
164 | if (pte_swp_soft_dirty(*ptep)) | ||
165 | pte = pte_mksoft_dirty(pte); | ||
164 | if (is_write_migration_entry(entry)) | 166 | if (is_write_migration_entry(entry)) |
165 | pte = pte_mkwrite(pte); | 167 | pte = pte_mkwrite(pte); |
166 | #ifdef CONFIG_HUGETLB_PAGE | 168 | #ifdef CONFIG_HUGETLB_PAGE |
@@ -1713,12 +1715,12 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | |||
1713 | unlock_page(new_page); | 1715 | unlock_page(new_page); |
1714 | put_page(new_page); /* Free it */ | 1716 | put_page(new_page); /* Free it */ |
1715 | 1717 | ||
1716 | unlock_page(page); | 1718 | /* Retake the callers reference and putback on LRU */ |
1719 | get_page(page); | ||
1717 | putback_lru_page(page); | 1720 | putback_lru_page(page); |
1718 | 1721 | mod_zone_page_state(page_zone(page), | |
1719 | count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR); | 1722 | NR_ISOLATED_ANON + page_lru, -HPAGE_PMD_NR); |
1720 | isolated = 0; | 1723 | goto out_fail; |
1721 | goto out; | ||
1722 | } | 1724 | } |
1723 | 1725 | ||
1724 | /* | 1726 | /* |
@@ -1735,9 +1737,9 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | |||
1735 | entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); | 1737 | entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); |
1736 | entry = pmd_mkhuge(entry); | 1738 | entry = pmd_mkhuge(entry); |
1737 | 1739 | ||
1738 | page_add_new_anon_rmap(new_page, vma, haddr); | 1740 | pmdp_clear_flush(vma, haddr, pmd); |
1739 | |||
1740 | set_pmd_at(mm, haddr, pmd, entry); | 1741 | set_pmd_at(mm, haddr, pmd, entry); |
1742 | page_add_new_anon_rmap(new_page, vma, haddr); | ||
1741 | update_mmu_cache_pmd(vma, address, &entry); | 1743 | update_mmu_cache_pmd(vma, address, &entry); |
1742 | page_remove_rmap(page); | 1744 | page_remove_rmap(page); |
1743 | /* | 1745 | /* |
@@ -1756,7 +1758,6 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | |||
1756 | count_vm_events(PGMIGRATE_SUCCESS, HPAGE_PMD_NR); | 1758 | count_vm_events(PGMIGRATE_SUCCESS, HPAGE_PMD_NR); |
1757 | count_vm_numa_events(NUMA_PAGE_MIGRATE, HPAGE_PMD_NR); | 1759 | count_vm_numa_events(NUMA_PAGE_MIGRATE, HPAGE_PMD_NR); |
1758 | 1760 | ||
1759 | out: | ||
1760 | mod_zone_page_state(page_zone(page), | 1761 | mod_zone_page_state(page_zone(page), |
1761 | NR_ISOLATED_ANON + page_lru, | 1762 | NR_ISOLATED_ANON + page_lru, |
1762 | -HPAGE_PMD_NR); | 1763 | -HPAGE_PMD_NR); |
@@ -1765,6 +1766,10 @@ out: | |||
1765 | out_fail: | 1766 | out_fail: |
1766 | count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR); | 1767 | count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR); |
1767 | out_dropref: | 1768 | out_dropref: |
1769 | entry = pmd_mknonnuma(entry); | ||
1770 | set_pmd_at(mm, haddr, pmd, entry); | ||
1771 | update_mmu_cache_pmd(vma, address, &entry); | ||
1772 | |||
1768 | unlock_page(page); | 1773 | unlock_page(page); |
1769 | put_page(page); | 1774 | put_page(page); |
1770 | return 0; | 1775 | return 0; |