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: