Skip to contentSkip to conversation

HWPOSION, hugetlb: lock_page/unlock_page does not match for handling a free hugepage

PATCH New Chen Yucong 1 participant 1 message May 10, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 HWPOSION, hugetlb: lock_page/unlock_page does not match for handling a free hugepage

For handling a free hugepage in memory failure, the race will happen if another thread hwpoisoned this hugepage concurrently. So we need to check PageHWPoison instead of !PageHWPoison.

If hwpoison_filter(p) returns true or a race happens, then we need to unlock_page(hpage).

---
mm/memory-failure.c | 15 ++++++++-------

1 file changed, 8 insertions(+), 7 deletions(-)
mm/memory-failure.c +0 -0
index 35ef28a..dbf8922 100644
@@ -1081,15 +1081,16 @@ int memory_failure(unsigned long pfn, int

trapno, int flags)
return 0;
} else if (PageHuge(hpage)) {
/*
- * Check "just unpoisoned", "filter hit", and
- * "race with other subpage."
+ * Check "filter hit" and "race with other subpage."
*/
lock_page(hpage);
- if (!PageHWPoison(hpage)

-			    || (hwpoison_filter(p) && TestClearPageHWPoison(p))
-			    || (p != hpage && TestSetPageHWPoison(hpage))) {

- atomic_long_sub(nr_pages, &num_poisoned_pages);
- return 0;
+ if (PageHWPoison(hpage)) {
+ if ((hwpoison_filter(p) && TestClearPageHWPoison(p))
+ || (p != hpage && TestSetPageHWPoison(hpage))) {
+ atomic_long_sub(nr_pages, &num_poisoned_pages);
+ unlock_page(hpage);
+ return 0;
+ }
} set_page_hwpoison_huge_page(hpage); res = dequeue_hwpoisoned_huge_page(hpage);

Signature · 1 line
1.7.10.4