aboutsummaryrefslogtreecommitdiffstats
path: root/mm/migrate.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/migrate.c')
-rw-r--r--mm/migrate.c154
1 files changed, 70 insertions, 84 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index 3b676b0c5c3e..3bbaf5d230b0 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -160,8 +160,10 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma,
160 if (is_write_migration_entry(entry)) 160 if (is_write_migration_entry(entry))
161 pte = pte_mkwrite(pte); 161 pte = pte_mkwrite(pte);
162#ifdef CONFIG_HUGETLB_PAGE 162#ifdef CONFIG_HUGETLB_PAGE
163 if (PageHuge(new)) 163 if (PageHuge(new)) {
164 pte = pte_mkhuge(pte); 164 pte = pte_mkhuge(pte);
165 pte = arch_make_huge_pte(pte, vma, new, 0);
166 }
165#endif 167#endif
166 flush_cache_page(vma, addr, pte_pfn(pte)); 168 flush_cache_page(vma, addr, pte_pfn(pte));
167 set_pte_at(mm, addr, ptep, pte); 169 set_pte_at(mm, addr, ptep, pte);
@@ -462,7 +464,10 @@ void migrate_page_copy(struct page *newpage, struct page *page)
462 464
463 mlock_migrate_page(newpage, page); 465 mlock_migrate_page(newpage, page);
464 ksm_migrate_page(newpage, page); 466 ksm_migrate_page(newpage, page);
465 467 /*
468 * Please do not reorder this without considering how mm/ksm.c's
469 * get_ksm_page() depends upon ksm_migrate_page() and PageSwapCache().
470 */
466 ClearPageSwapCache(page); 471 ClearPageSwapCache(page);
467 ClearPagePrivate(page); 472 ClearPagePrivate(page);
468 set_page_private(page, 0); 473 set_page_private(page, 0);
@@ -696,7 +701,7 @@ static int move_to_new_page(struct page *newpage, struct page *page,
696} 701}
697 702
698static int __unmap_and_move(struct page *page, struct page *newpage, 703static int __unmap_and_move(struct page *page, struct page *newpage,
699 int force, bool offlining, enum migrate_mode mode) 704 int force, enum migrate_mode mode)
700{ 705{
701 int rc = -EAGAIN; 706 int rc = -EAGAIN;
702 int remap_swapcache = 1; 707 int remap_swapcache = 1;
@@ -726,20 +731,6 @@ static int __unmap_and_move(struct page *page, struct page *newpage,
726 lock_page(page); 731 lock_page(page);
727 } 732 }
728 733
729 /*
730 * Only memory hotplug's offline_pages() caller has locked out KSM,
731 * and can safely migrate a KSM page. The other cases have skipped
732 * PageKsm along with PageReserved - but it is only now when we have
733 * the page lock that we can be certain it will not go KSM beneath us
734 * (KSM will not upgrade a page from PageAnon to PageKsm when it sees
735 * its pagecount raised, but only here do we take the page lock which
736 * serializes that).
737 */
738 if (PageKsm(page) && !offlining) {
739 rc = -EBUSY;
740 goto unlock;
741 }
742
743 /* charge against new page */ 734 /* charge against new page */
744 mem_cgroup_prepare_migration(page, newpage, &mem); 735 mem_cgroup_prepare_migration(page, newpage, &mem);
745 736
@@ -766,7 +757,7 @@ static int __unmap_and_move(struct page *page, struct page *newpage,
766 * File Caches may use write_page() or lock_page() in migration, then, 757 * File Caches may use write_page() or lock_page() in migration, then,
767 * just care Anon page here. 758 * just care Anon page here.
768 */ 759 */
769 if (PageAnon(page)) { 760 if (PageAnon(page) && !PageKsm(page)) {
770 /* 761 /*
771 * Only page_lock_anon_vma_read() understands the subtleties of 762 * Only page_lock_anon_vma_read() understands the subtleties of
772 * getting a hold on an anon_vma from outside one of its mms. 763 * getting a hold on an anon_vma from outside one of its mms.
@@ -846,7 +837,6 @@ uncharge:
846 mem_cgroup_end_migration(mem, page, newpage, 837 mem_cgroup_end_migration(mem, page, newpage,
847 (rc == MIGRATEPAGE_SUCCESS || 838 (rc == MIGRATEPAGE_SUCCESS ||
848 rc == MIGRATEPAGE_BALLOON_SUCCESS)); 839 rc == MIGRATEPAGE_BALLOON_SUCCESS));
849unlock:
850 unlock_page(page); 840 unlock_page(page);
851out: 841out:
852 return rc; 842 return rc;
@@ -857,8 +847,7 @@ out:
857 * to the newly allocated page in newpage. 847 * to the newly allocated page in newpage.
858 */ 848 */
859static int unmap_and_move(new_page_t get_new_page, unsigned long private, 849static int unmap_and_move(new_page_t get_new_page, unsigned long private,
860 struct page *page, int force, bool offlining, 850 struct page *page, int force, enum migrate_mode mode)
861 enum migrate_mode mode)
862{ 851{
863 int rc = 0; 852 int rc = 0;
864 int *result = NULL; 853 int *result = NULL;
@@ -876,7 +865,7 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private,
876 if (unlikely(split_huge_page(page))) 865 if (unlikely(split_huge_page(page)))
877 goto out; 866 goto out;
878 867
879 rc = __unmap_and_move(page, newpage, force, offlining, mode); 868 rc = __unmap_and_move(page, newpage, force, mode);
880 869
881 if (unlikely(rc == MIGRATEPAGE_BALLOON_SUCCESS)) { 870 if (unlikely(rc == MIGRATEPAGE_BALLOON_SUCCESS)) {
882 /* 871 /*
@@ -936,8 +925,7 @@ out:
936 */ 925 */
937static int unmap_and_move_huge_page(new_page_t get_new_page, 926static int unmap_and_move_huge_page(new_page_t get_new_page,
938 unsigned long private, struct page *hpage, 927 unsigned long private, struct page *hpage,
939 int force, bool offlining, 928 int force, enum migrate_mode mode)
940 enum migrate_mode mode)
941{ 929{
942 int rc = 0; 930 int rc = 0;
943 int *result = NULL; 931 int *result = NULL;
@@ -999,9 +987,8 @@ out:
999 * 987 *
1000 * Return: Number of pages not migrated or error code. 988 * Return: Number of pages not migrated or error code.
1001 */ 989 */
1002int migrate_pages(struct list_head *from, 990int migrate_pages(struct list_head *from, new_page_t get_new_page,
1003 new_page_t get_new_page, unsigned long private, bool offlining, 991 unsigned long private, enum migrate_mode mode, int reason)
1004 enum migrate_mode mode, int reason)
1005{ 992{
1006 int retry = 1; 993 int retry = 1;
1007 int nr_failed = 0; 994 int nr_failed = 0;
@@ -1022,8 +1009,7 @@ int migrate_pages(struct list_head *from,
1022 cond_resched(); 1009 cond_resched();
1023 1010
1024 rc = unmap_and_move(get_new_page, private, 1011 rc = unmap_and_move(get_new_page, private,
1025 page, pass > 2, offlining, 1012 page, pass > 2, mode);
1026 mode);
1027 1013
1028 switch(rc) { 1014 switch(rc) {
1029 case -ENOMEM: 1015 case -ENOMEM:
@@ -1056,15 +1042,13 @@ out:
1056} 1042}
1057 1043
1058int migrate_huge_page(struct page *hpage, new_page_t get_new_page, 1044int migrate_huge_page(struct page *hpage, new_page_t get_new_page,
1059 unsigned long private, bool offlining, 1045 unsigned long private, enum migrate_mode mode)
1060 enum migrate_mode mode)
1061{ 1046{
1062 int pass, rc; 1047 int pass, rc;
1063 1048
1064 for (pass = 0; pass < 10; pass++) { 1049 for (pass = 0; pass < 10; pass++) {
1065 rc = unmap_and_move_huge_page(get_new_page, 1050 rc = unmap_and_move_huge_page(get_new_page, private,
1066 private, hpage, pass > 2, offlining, 1051 hpage, pass > 2, mode);
1067 mode);
1068 switch (rc) { 1052 switch (rc) {
1069 case -ENOMEM: 1053 case -ENOMEM:
1070 goto out; 1054 goto out;
@@ -1150,7 +1134,7 @@ static int do_move_page_to_node_array(struct mm_struct *mm,
1150 goto set_status; 1134 goto set_status;
1151 1135
1152 /* Use PageReserved to check for zero page */ 1136 /* Use PageReserved to check for zero page */
1153 if (PageReserved(page) || PageKsm(page)) 1137 if (PageReserved(page))
1154 goto put_and_set; 1138 goto put_and_set;
1155 1139
1156 pp->page = page; 1140 pp->page = page;
@@ -1187,8 +1171,7 @@ set_status:
1187 err = 0; 1171 err = 0;
1188 if (!list_empty(&pagelist)) { 1172 if (!list_empty(&pagelist)) {
1189 err = migrate_pages(&pagelist, new_page_node, 1173 err = migrate_pages(&pagelist, new_page_node,
1190 (unsigned long)pm, 0, MIGRATE_SYNC, 1174 (unsigned long)pm, MIGRATE_SYNC, MR_SYSCALL);
1191 MR_SYSCALL);
1192 if (err) 1175 if (err)
1193 putback_lru_pages(&pagelist); 1176 putback_lru_pages(&pagelist);
1194 } 1177 }
@@ -1312,7 +1295,7 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
1312 1295
1313 err = -ENOENT; 1296 err = -ENOENT;
1314 /* Use PageReserved to check for zero page */ 1297 /* Use PageReserved to check for zero page */
1315 if (!page || PageReserved(page) || PageKsm(page)) 1298 if (!page || PageReserved(page))
1316 goto set_status; 1299 goto set_status;
1317 1300
1318 err = page_to_nid(page); 1301 err = page_to_nid(page);
@@ -1459,7 +1442,7 @@ int migrate_vmas(struct mm_struct *mm, const nodemask_t *to,
1459 * pages. Currently it only checks the watermarks which crude 1442 * pages. Currently it only checks the watermarks which crude
1460 */ 1443 */
1461static bool migrate_balanced_pgdat(struct pglist_data *pgdat, 1444static bool migrate_balanced_pgdat(struct pglist_data *pgdat,
1462 int nr_migrate_pages) 1445 unsigned long nr_migrate_pages)
1463{ 1446{
1464 int z; 1447 int z;
1465 for (z = pgdat->nr_zones - 1; z >= 0; z--) { 1448 for (z = pgdat->nr_zones - 1; z >= 0; z--) {
@@ -1495,7 +1478,7 @@ static struct page *alloc_misplaced_dst_page(struct page *page,
1495 __GFP_NOWARN) & 1478 __GFP_NOWARN) &
1496 ~GFP_IOFS, 0); 1479 ~GFP_IOFS, 0);
1497 if (newpage) 1480 if (newpage)
1498 page_xchg_last_nid(newpage, page_last_nid(page)); 1481 page_nid_xchg_last(newpage, page_nid_last(page));
1499 1482
1500 return newpage; 1483 return newpage;
1501} 1484}
@@ -1555,39 +1538,40 @@ bool numamigrate_update_ratelimit(pg_data_t *pgdat, unsigned long nr_pages)
1555 1538
1556int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page) 1539int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page)
1557{ 1540{
1558 int ret = 0; 1541 int page_lru;
1542
1543 VM_BUG_ON(compound_order(page) && !PageTransHuge(page));
1559 1544
1560 /* Avoid migrating to a node that is nearly full */ 1545 /* Avoid migrating to a node that is nearly full */
1561 if (migrate_balanced_pgdat(pgdat, 1)) { 1546 if (!migrate_balanced_pgdat(pgdat, 1UL << compound_order(page)))
1562 int page_lru; 1547 return 0;
1563 1548
1564 if (isolate_lru_page(page)) { 1549 if (isolate_lru_page(page))
1565 put_page(page); 1550 return 0;
1566 return 0;
1567 }
1568 1551
1569 /* Page is isolated */ 1552 /*
1570 ret = 1; 1553 * migrate_misplaced_transhuge_page() skips page migration's usual
1571 page_lru = page_is_file_cache(page); 1554 * check on page_count(), so we must do it here, now that the page
1572 if (!PageTransHuge(page)) 1555 * has been isolated: a GUP pin, or any other pin, prevents migration.
1573 inc_zone_page_state(page, NR_ISOLATED_ANON + page_lru); 1556 * The expected page count is 3: 1 for page's mapcount and 1 for the
1574 else 1557 * caller's pin and 1 for the reference taken by isolate_lru_page().
1575 mod_zone_page_state(page_zone(page), 1558 */
1576 NR_ISOLATED_ANON + page_lru, 1559 if (PageTransHuge(page) && page_count(page) != 3) {
1577 HPAGE_PMD_NR); 1560 putback_lru_page(page);
1561 return 0;
1578 } 1562 }
1579 1563
1564 page_lru = page_is_file_cache(page);
1565 mod_zone_page_state(page_zone(page), NR_ISOLATED_ANON + page_lru,
1566 hpage_nr_pages(page));
1567
1580 /* 1568 /*
1581 * Page is either isolated or there is not enough space on the target 1569 * Isolating the page has taken another reference, so the
1582 * node. If isolated, then it has taken a reference count and the 1570 * caller's reference can be safely dropped without the page
1583 * callers reference can be safely dropped without the page 1571 * disappearing underneath us during migration.
1584 * disappearing underneath us during migration. Otherwise the page is
1585 * not to be migrated but the callers reference should still be
1586 * dropped so it does not leak.
1587 */ 1572 */
1588 put_page(page); 1573 put_page(page);
1589 1574 return 1;
1590 return ret;
1591} 1575}
1592 1576
1593/* 1577/*
@@ -1598,7 +1582,7 @@ int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page)
1598int migrate_misplaced_page(struct page *page, int node) 1582int migrate_misplaced_page(struct page *page, int node)
1599{ 1583{
1600 pg_data_t *pgdat = NODE_DATA(node); 1584 pg_data_t *pgdat = NODE_DATA(node);
1601 int isolated = 0; 1585 int isolated;
1602 int nr_remaining; 1586 int nr_remaining;
1603 LIST_HEAD(migratepages); 1587 LIST_HEAD(migratepages);
1604 1588
@@ -1606,42 +1590,43 @@ int migrate_misplaced_page(struct page *page, int node)
1606 * Don't migrate pages that are mapped in multiple processes. 1590 * Don't migrate pages that are mapped in multiple processes.
1607 * TODO: Handle false sharing detection instead of this hammer 1591 * TODO: Handle false sharing detection instead of this hammer
1608 */ 1592 */
1609 if (page_mapcount(page) != 1) { 1593 if (page_mapcount(page) != 1)
1610 put_page(page);
1611 goto out; 1594 goto out;
1612 }
1613 1595
1614 /* 1596 /*
1615 * Rate-limit the amount of data that is being migrated to a node. 1597 * Rate-limit the amount of data that is being migrated to a node.
1616 * Optimal placement is no good if the memory bus is saturated and 1598 * Optimal placement is no good if the memory bus is saturated and
1617 * all the time is being spent migrating! 1599 * all the time is being spent migrating!
1618 */ 1600 */
1619 if (numamigrate_update_ratelimit(pgdat, 1)) { 1601 if (numamigrate_update_ratelimit(pgdat, 1))
1620 put_page(page);
1621 goto out; 1602 goto out;
1622 }
1623 1603
1624 isolated = numamigrate_isolate_page(pgdat, page); 1604 isolated = numamigrate_isolate_page(pgdat, page);
1625 if (!isolated) 1605 if (!isolated)
1626 goto out; 1606 goto out;
1627 1607
1628 list_add(&page->lru, &migratepages); 1608 list_add(&page->lru, &migratepages);
1629 nr_remaining = migrate_pages(&migratepages, 1609 nr_remaining = migrate_pages(&migratepages, alloc_misplaced_dst_page,
1630 alloc_misplaced_dst_page, 1610 node, MIGRATE_ASYNC, MR_NUMA_MISPLACED);
1631 node, false, MIGRATE_ASYNC,
1632 MR_NUMA_MISPLACED);
1633 if (nr_remaining) { 1611 if (nr_remaining) {
1634 putback_lru_pages(&migratepages); 1612 putback_lru_pages(&migratepages);
1635 isolated = 0; 1613 isolated = 0;
1636 } else 1614 } else
1637 count_vm_numa_event(NUMA_PAGE_MIGRATE); 1615 count_vm_numa_event(NUMA_PAGE_MIGRATE);
1638 BUG_ON(!list_empty(&migratepages)); 1616 BUG_ON(!list_empty(&migratepages));
1639out:
1640 return isolated; 1617 return isolated;
1618
1619out:
1620 put_page(page);
1621 return 0;
1641} 1622}
1642#endif /* CONFIG_NUMA_BALANCING */ 1623#endif /* CONFIG_NUMA_BALANCING */
1643 1624
1644#if defined(CONFIG_NUMA_BALANCING) && defined(CONFIG_TRANSPARENT_HUGEPAGE) 1625#if defined(CONFIG_NUMA_BALANCING) && defined(CONFIG_TRANSPARENT_HUGEPAGE)
1626/*
1627 * Migrates a THP to a given target node. page must be locked and is unlocked
1628 * before returning.
1629 */
1645int migrate_misplaced_transhuge_page(struct mm_struct *mm, 1630int migrate_misplaced_transhuge_page(struct mm_struct *mm,
1646 struct vm_area_struct *vma, 1631 struct vm_area_struct *vma,
1647 pmd_t *pmd, pmd_t entry, 1632 pmd_t *pmd, pmd_t entry,
@@ -1672,17 +1657,15 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm,
1672 1657
1673 new_page = alloc_pages_node(node, 1658 new_page = alloc_pages_node(node,
1674 (GFP_TRANSHUGE | GFP_THISNODE) & ~__GFP_WAIT, HPAGE_PMD_ORDER); 1659 (GFP_TRANSHUGE | GFP_THISNODE) & ~__GFP_WAIT, HPAGE_PMD_ORDER);
1675 if (!new_page) { 1660 if (!new_page)
1676 count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR); 1661 goto out_fail;
1677 goto out_dropref; 1662
1678 } 1663 page_nid_xchg_last(new_page, page_nid_last(page));
1679 page_xchg_last_nid(new_page, page_last_nid(page));
1680 1664
1681 isolated = numamigrate_isolate_page(pgdat, page); 1665 isolated = numamigrate_isolate_page(pgdat, page);
1682 if (!isolated) { 1666 if (!isolated) {
1683 count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR);
1684 put_page(new_page); 1667 put_page(new_page);
1685 goto out_keep_locked; 1668 goto out_fail;
1686 } 1669 }
1687 1670
1688 /* Prepare a page as a migration target */ 1671 /* Prepare a page as a migration target */
@@ -1714,6 +1697,7 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm,
1714 putback_lru_page(page); 1697 putback_lru_page(page);
1715 1698
1716 count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR); 1699 count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR);
1700 isolated = 0;
1717 goto out; 1701 goto out;
1718 } 1702 }
1719 1703
@@ -1758,9 +1742,11 @@ out:
1758 -HPAGE_PMD_NR); 1742 -HPAGE_PMD_NR);
1759 return isolated; 1743 return isolated;
1760 1744
1745out_fail:
1746 count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR);
1761out_dropref: 1747out_dropref:
1748 unlock_page(page);
1762 put_page(page); 1749 put_page(page);
1763out_keep_locked:
1764 return 0; 1750 return 0;
1765} 1751}
1766#endif /* CONFIG_NUMA_BALANCING */ 1752#endif /* CONFIG_NUMA_BALANCING */