diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 2e94ad1133af3634fb3a01c1f8371e7323c37a87..5785b59620ef4b3fef56bba849c0a835a8774896 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1718,12 +1718,12 @@ int soft_offline_page(struct page *page, int flags) } else { /* for free pages */ if (PageHuge(page)) { set_page_hwpoison_huge_page(hpage); - dequeue_hwpoisoned_huge_page(hpage); - atomic_long_add(1 << compound_order(hpage), + if (!dequeue_hwpoisoned_huge_page(hpage)) + atomic_long_add(1 << compound_order(hpage), &num_poisoned_pages); } else { - SetPageHWPoison(page); - atomic_long_inc(&num_poisoned_pages); + if (!TestSetPageHWPoison(page)) + atomic_long_inc(&num_poisoned_pages); } } unset: