aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memory-failure.c
diff options
context:
space:
mode:
authorNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>2013-09-11 17:22:01 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-11 18:57:47 -0400
commitb8ec1cee5a4375c1244b85709138a2eac2d89cb6 (patch)
treec3c548949ac53e1a66d891171d4b176f1d11538d /mm/memory-failure.c
parent31caf665e666b51fe36efd1e54031ed29e86c0b4 (diff)
mm: soft-offline: use migrate_pages() instead of migrate_huge_page()
Currently migrate_huge_page() takes a pointer to a hugepage to be migrated as an argument, instead of taking a pointer to the list of hugepages to be migrated. This behavior was introduced in commit 189ebff28 ("hugetlb: simplify migrate_huge_page()"), and was OK because until now hugepage migration is enabled only for soft-offlining which migrates only one hugepage in a single call. But the situation will change in the later patches in this series which enable other users of page migration to support hugepage migration. They can kick migration for both of normal pages and hugepages in a single call, so we need to go back to original implementation which uses linked lists to collect the hugepages to be migrated. With this patch, soft_offline_huge_page() switches to use migrate_pages(), and migrate_huge_page() is not used any more. So let's remove it. Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> Acked-by: Andi Kleen <ak@linux.intel.com> Reviewed-by: Wanpeng Li <liwanp@linux.vnet.ibm.com> Acked-by: Hillf Danton <dhillf@gmail.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Hugh Dickins <hughd@google.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Michal Hocko <mhocko@suse.cz> Cc: Rik van Riel <riel@redhat.com> Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memory-failure.c')
-rw-r--r--mm/memory-failure.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index d84c5e5331bb..e05ed31c0f61 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1470,6 +1470,7 @@ static int soft_offline_huge_page(struct page *page, int flags)
1470 int ret; 1470 int ret;
1471 unsigned long pfn = page_to_pfn(page); 1471 unsigned long pfn = page_to_pfn(page);
1472 struct page *hpage = compound_head(page); 1472 struct page *hpage = compound_head(page);
1473 LIST_HEAD(pagelist);
1473 1474
1474 /* 1475 /*
1475 * This double-check of PageHWPoison is to avoid the race with 1476 * This double-check of PageHWPoison is to avoid the race with
@@ -1485,12 +1486,20 @@ static int soft_offline_huge_page(struct page *page, int flags)
1485 unlock_page(hpage); 1486 unlock_page(hpage);
1486 1487
1487 /* Keep page count to indicate a given hugepage is isolated. */ 1488 /* Keep page count to indicate a given hugepage is isolated. */
1488 ret = migrate_huge_page(hpage, new_page, MPOL_MF_MOVE_ALL, 1489 list_move(&hpage->lru, &pagelist);
1489 MIGRATE_SYNC); 1490 ret = migrate_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL,
1490 put_page(hpage); 1491 MIGRATE_SYNC, MR_MEMORY_FAILURE);
1491 if (ret) { 1492 if (ret) {
1492 pr_info("soft offline: %#lx: migration failed %d, type %lx\n", 1493 pr_info("soft offline: %#lx: migration failed %d, type %lx\n",
1493 pfn, ret, page->flags); 1494 pfn, ret, page->flags);
1495 /*
1496 * We know that soft_offline_huge_page() tries to migrate
1497 * only one hugepage pointed to by hpage, so we need not
1498 * run through the pagelist here.
1499 */
1500 putback_active_hugepage(hpage);
1501 if (ret > 0)
1502 ret = -EIO;
1494 } else { 1503 } else {
1495 set_page_hwpoison_huge_page(hpage); 1504 set_page_hwpoison_huge_page(hpage);
1496 dequeue_hwpoisoned_huge_page(hpage); 1505 dequeue_hwpoisoned_huge_page(hpage);