|
@@ -220,6 +220,9 @@ static int kill_proc(struct task_struct *t, unsigned long addr, int trapno,
|
|
|
*/
|
|
|
void shake_page(struct page *p, int access)
|
|
|
{
|
|
|
+ if (PageHuge(p))
|
|
|
+ return;
|
|
|
+
|
|
|
if (!PageSlab(p)) {
|
|
|
lru_add_drain_all();
|
|
|
if (PageLRU(p))
|
|
@@ -1137,22 +1140,14 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
|
|
* The check (unnecessarily) ignores LRU pages being isolated and
|
|
|
* walked by the page reclaim code, however that's not a big loss.
|
|
|
*/
|
|
|
- if (!PageHuge(p)) {
|
|
|
- if (!PageLRU(p))
|
|
|
- shake_page(p, 0);
|
|
|
- if (!PageLRU(p)) {
|
|
|
- /*
|
|
|
- * shake_page could have turned it free.
|
|
|
- */
|
|
|
- if (is_free_buddy_page(p)) {
|
|
|
- if (flags & MF_COUNT_INCREASED)
|
|
|
- action_result(pfn, MF_MSG_BUDDY, MF_DELAYED);
|
|
|
- else
|
|
|
- action_result(pfn, MF_MSG_BUDDY_2ND,
|
|
|
- MF_DELAYED);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
+ shake_page(p, 0);
|
|
|
+ /* shake_page could have turned it free. */
|
|
|
+ if (!PageLRU(p) && is_free_buddy_page(p)) {
|
|
|
+ if (flags & MF_COUNT_INCREASED)
|
|
|
+ action_result(pfn, MF_MSG_BUDDY, MF_DELAYED);
|
|
|
+ else
|
|
|
+ action_result(pfn, MF_MSG_BUDDY_2ND, MF_DELAYED);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
lock_page(hpage);
|