diff options
Diffstat (limited to 'mm/memory-failure.c')
-rw-r--r-- | mm/memory-failure.c | 15 |
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); |