diff options
Diffstat (limited to 'mm/migrate.c')
-rw-r--r-- | mm/migrate.c | 154 |
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 | ||
698 | static int __unmap_and_move(struct page *page, struct page *newpage, | 703 | static 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)); |
849 | unlock: | ||
850 | unlock_page(page); | 840 | unlock_page(page); |
851 | out: | 841 | out: |
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 | */ |
859 | static int unmap_and_move(new_page_t get_new_page, unsigned long private, | 849 | static 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 | */ |
937 | static int unmap_and_move_huge_page(new_page_t get_new_page, | 926 | static 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 | */ |
1002 | int migrate_pages(struct list_head *from, | 990 | int 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 | ||
1058 | int migrate_huge_page(struct page *hpage, new_page_t get_new_page, | 1044 | int 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 | */ |
1461 | static bool migrate_balanced_pgdat(struct pglist_data *pgdat, | 1444 | static 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 | ||
1556 | int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page) | 1539 | int 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) | |||
1598 | int migrate_misplaced_page(struct page *page, int node) | 1582 | int 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)); |
1639 | out: | ||
1640 | return isolated; | 1617 | return isolated; |
1618 | |||
1619 | out: | ||
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 | */ | ||
1645 | int migrate_misplaced_transhuge_page(struct mm_struct *mm, | 1630 | int 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 | ||
1745 | out_fail: | ||
1746 | count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR); | ||
1761 | out_dropref: | 1747 | out_dropref: |
1748 | unlock_page(page); | ||
1762 | put_page(page); | 1749 | put_page(page); |
1763 | out_keep_locked: | ||
1764 | return 0; | 1750 | return 0; |
1765 | } | 1751 | } |
1766 | #endif /* CONFIG_NUMA_BALANCING */ | 1752 | #endif /* CONFIG_NUMA_BALANCING */ |