diff options
Diffstat (limited to 'mm/memory-failure.c')
| -rw-r--r-- | mm/memory-failure.c | 9 | 
1 files changed, 5 insertions, 4 deletions
| diff --git a/mm/memory-failure.c b/mm/memory-failure.c index cd8989c1027e..c6399e328931 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -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 |