|
@@ -895,7 +895,7 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn,
|
|
|
struct page *hpage = *hpagep;
|
|
|
struct page *ppage;
|
|
|
|
|
|
- if (PageReserved(p) || PageSlab(p))
|
|
|
+ if (PageReserved(p) || PageSlab(p) || !PageLRU(p))
|
|
|
return SWAP_SUCCESS;
|
|
|
|
|
|
/*
|
|
@@ -1159,9 +1159,6 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
|
|
action_result(pfn, "free buddy, 2nd try", DELAYED);
|
|
|
return 0;
|
|
|
}
|
|
|
- action_result(pfn, "non LRU", IGNORED);
|
|
|
- put_page(p);
|
|
|
- return -EBUSY;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1194,6 +1191,9 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ if (!PageHuge(p) && !PageTransTail(p) && !PageLRU(p))
|
|
|
+ goto identify_page_state;
|
|
|
+
|
|
|
/*
|
|
|
* For error on the tail page, we should set PG_hwpoison
|
|
|
* on the head page to show that the hugepage is hwpoisoned
|
|
@@ -1243,6 +1243,7 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+identify_page_state:
|
|
|
res = -EBUSY;
|
|
|
/*
|
|
|
* The first check uses the current page flags which may not have any
|