diff options
Diffstat (limited to 'mm/memory-failure.c')
| -rw-r--r-- | mm/memory-failure.c | 20 | 
1 files changed, 9 insertions, 11 deletions
| diff --git a/mm/memory-failure.c b/mm/memory-failure.c index fc30ca4804bf..df6ee59527dd 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -956,7 +956,7 @@ static const char * const action_page_types[] = {  	[MF_MSG_BUDDY]			= "free buddy page",  	[MF_MSG_DAX]			= "dax page",  	[MF_MSG_UNSPLIT_THP]		= "unsplit thp", -	[MF_MSG_ALREADY_POISONED]	= "already poisoned", +	[MF_MSG_ALREADY_POISONED]	= "already poisoned page",  	[MF_MSG_UNKNOWN]		= "unknown page",  }; @@ -1349,9 +1349,10 @@ static int action_result(unsigned long pfn, enum mf_action_page_type type,  {  	trace_memory_failure_event(pfn, type, result); -	num_poisoned_pages_inc(pfn); - -	update_per_node_mf_stats(pfn, result); +	if (type != MF_MSG_ALREADY_POISONED) { +		num_poisoned_pages_inc(pfn); +		update_per_node_mf_stats(pfn, result); +	}  	pr_err("%#lx: recovery action for %s: %s\n",  		pfn, action_page_types[type], action_name[result]); @@ -2094,12 +2095,11 @@ retry:  		*hugetlb = 0;  		return 0;  	} else if (res == -EHWPOISON) { -		pr_err("%#lx: already hardware poisoned\n", pfn);  		if (flags & MF_ACTION_REQUIRED) {  			folio = page_folio(p);  			res = kill_accessing_process(current, folio_pfn(folio), flags); -			action_result(pfn, MF_MSG_ALREADY_POISONED, MF_FAILED);  		} +		action_result(pfn, MF_MSG_ALREADY_POISONED, MF_FAILED);  		return res;  	} else if (res == -EBUSY) {  		if (!(flags & MF_NO_RETRY)) { @@ -2285,7 +2285,6 @@ try_again:  		goto unlock_mutex;  	if (TestSetPageHWPoison(p)) { -		pr_err("%#lx: already hardware poisoned\n", pfn);  		res = -EHWPOISON;  		if (flags & MF_ACTION_REQUIRED)  			res = kill_accessing_process(current, pfn, flags); @@ -2569,10 +2568,9 @@ int unpoison_memory(unsigned long pfn)  	static DEFINE_RATELIMIT_STATE(unpoison_rs, DEFAULT_RATELIMIT_INTERVAL,  					DEFAULT_RATELIMIT_BURST); -	if (!pfn_valid(pfn)) -		return -ENXIO; - -	p = pfn_to_page(pfn); +	p = pfn_to_online_page(pfn); +	if (!p) +		return -EIO;  	folio = page_folio(p);  	mutex_lock(&mf_mutex); | 
