summaryrefslogtreecommitdiffstats
path: root/mm/memory-failure.c
diff options
context:
space:
mode:
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);