Skip to contentSkip to conversation

Fix poison failure for unmapped hugetlb page without MF_COUNT_INCREASED.

PATCH RESEND New Jin Dongming 1 participant 1 message Feb 7, 2011

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

PATCH RESEND 2/3 Fix poison failure for unmapped hugetlb page without MF_COUNT_INCREASED.

The unmapped hugetlb page could not be poisoned when the tail page is poisoned.

The reason is because the PG_hwpoison of head page is checked before setting PG_hwpoison on other pages of the hugetlb page.
- If the head page is not poisoned, the rest pages of

    hugetlb page will not be set with PG_hwpoison;

- If the head page is poisoned, poisoning for the hugetlb page has been finished by other context running simultaneously.

Usually the head page here is not poisoned yet, so __memory_failure() will return without poisoning the rest pages of hugetlb page.

As it is described in the comment(in __memory_failure()):
994 /*

 995                * Check "just unpoisoned", "filter hit", and
 996                * "race with other subpage."
 997                */

I think the real checking expected here is "just unpoisoned", whether the tail page just poisoned by this context is still poisoned or not. It should be realized by checking agaist the poisoned tail page, not against the head page.

---
 mm/memory-failure.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
mm/memory-failure.c +1 -1
index d2c2a7b..0317cb3 100644
@@ -1039,7 +1039,7 @@ int __memory_failure(unsigned long pfn, int trapno, int flags)
 			 * "race with other subpage."
 			 */
 			lock_page_nosync(hpage);
-			if (!PageHWPoison(hpage)
+			if (!PageHWPoison(p)
 			    || (hwpoison_filter(p) && TestClearPageHWPoison(p))
 			    || (p != hpage && TestSetPageHWPoison(hpage))) {
 				atomic_long_sub(nr_pages, &mce_bad_pages);
Signature · 1 line
1.7.2.2