Commit 9113eaf3 authored by zhenwei pi's avatar zhenwei pi Committed by Andrew Morton

mm/memory-failure.c: add hwpoison_filter for soft offline

hwpoison_filter is missing in the soft offline path, this leads an issue:
after enabling the corrupt filter, the user process still has a chance to
inject hwpoison fault by madvise(addr, len, MADV_SOFT_OFFLINE) at PFN
which is expected to reject.

Also do a minor change in comment of memory_failure().

Link: https://lkml.kernel.org/r/20220509105641.491313-4-pizhenwei@bytedance.comSigned-off-by: default avatarzhenwei pi <pizhenwei@bytedance.com>
Acked-by: default avatarNaoya Horiguchi <naoya.horiguchi@nec.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent c8bd84f7
...@@ -1751,7 +1751,7 @@ static DEFINE_MUTEX(mf_mutex); ...@@ -1751,7 +1751,7 @@ static DEFINE_MUTEX(mf_mutex);
* enabled and no spinlocks hold. * enabled and no spinlocks hold.
* *
* Return: 0 for successfully handled the memory error, * Return: 0 for successfully handled the memory error,
* -EOPNOTSUPP for memory_filter() filtered the error event, * -EOPNOTSUPP for hwpoison_filter() filtered the error event,
* < 0(except -EOPNOTSUPP) on failure. * < 0(except -EOPNOTSUPP) on failure.
*/ */
int memory_failure(unsigned long pfn, int flags) int memory_failure(unsigned long pfn, int flags)
...@@ -2308,7 +2308,9 @@ static void put_ref_page(struct page *page) ...@@ -2308,7 +2308,9 @@ static void put_ref_page(struct page *page)
* @pfn: pfn to soft-offline * @pfn: pfn to soft-offline
* @flags: flags. Same as memory_failure(). * @flags: flags. Same as memory_failure().
* *
* Returns 0 on success, otherwise negated errno. * Returns 0 on success
* -EOPNOTSUPP for hwpoison_filter() filtered the error event
* < 0 otherwise negated errno.
* *
* Soft offline a page, by migration or invalidation, * Soft offline a page, by migration or invalidation,
* without killing anything. This is for the case when * without killing anything. This is for the case when
...@@ -2359,6 +2361,16 @@ int soft_offline_page(unsigned long pfn, int flags) ...@@ -2359,6 +2361,16 @@ int soft_offline_page(unsigned long pfn, int flags)
ret = get_hwpoison_page(page, flags | MF_SOFT_OFFLINE); ret = get_hwpoison_page(page, flags | MF_SOFT_OFFLINE);
put_online_mems(); put_online_mems();
if (hwpoison_filter(page)) {
if (ret > 0)
put_page(page);
else
put_ref_page(ref_page);
mutex_unlock(&mf_mutex);
return -EOPNOTSUPP;
}
if (ret > 0) { if (ret > 0) {
ret = soft_offline_in_use_page(page); ret = soft_offline_in_use_page(page);
} else if (ret == 0) { } else if (ret == 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment