提交 101a2bd7 编写于 作者: O Oscar Salvador 提交者: Yang Yingliang

mm,hwpoison: return 0 if the page is already poisoned in soft-offline

mainline inclusion
from linux-v5.10-rc1
commit 5a2ffca3
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I4LE22
CVE: NA

--------------------------------

Currently, there is an inconsistency when calling soft-offline from
different paths on a page that is already poisoned.

1) madvise:

        madvise_inject_error skips any poisoned page and continues
        the loop.
        If that was the only page to madvise, it returns 0.

2) /sys/devices/system/memory/:

        When calling soft_offline_page_store()->soft_offline_page(),
        we return -EBUSY in case the page is already poisoned.
        This is inconsistent with a) the above example and b)
        memory_failure, where we return 0 if the page was poisoned.

Fix this by dropping the PageHWPoison() check in madvise_inject_error, and
let soft_offline_page return 0 if it finds the page already poisoned.

Please, note that this represents a user-api change, since now the return
error when calling soft_offline_page_store()->soft_offline_page() will be
different.
Signed-off-by: NOscar Salvador <osalvador@suse.de>
Acked-by: NNaoya Horiguchi <naoya.horiguchi@nec.com>
Signed-off-by: NMa Wupeng <mawupeng1@huawei.com>
Reviewed-by: NKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 b42e91fc
...@@ -662,11 +662,6 @@ static int madvise_inject_error(int behavior, ...@@ -662,11 +662,6 @@ static int madvise_inject_error(int behavior,
*/ */
order = compound_order(compound_head(page)); order = compound_order(compound_head(page));
if (PageHWPoison(page)) {
put_page(page);
continue;
}
if (behavior == MADV_SOFT_OFFLINE) { if (behavior == MADV_SOFT_OFFLINE) {
pr_info("Soft offlining pfn %#lx at process virtual address %#lx\n", pr_info("Soft offlining pfn %#lx at process virtual address %#lx\n",
pfn, start); pfn, start);
......
...@@ -1796,7 +1796,7 @@ static int __soft_offline_page(struct page *page) ...@@ -1796,7 +1796,7 @@ static int __soft_offline_page(struct page *page)
unlock_page(page); unlock_page(page);
put_page(page); put_page(page);
pr_info("soft offline: %#lx page already poisoned\n", pfn); pr_info("soft offline: %#lx page already poisoned\n", pfn);
return -EBUSY; return 0;
} }
if (!PageHuge(page)) if (!PageHuge(page))
...@@ -1902,7 +1902,7 @@ int soft_offline_page(struct page *page, int flags) ...@@ -1902,7 +1902,7 @@ int soft_offline_page(struct page *page, int flags)
pr_info("soft offline: %#lx page already poisoned\n", pfn); pr_info("soft offline: %#lx page already poisoned\n", pfn);
if (flags & MF_COUNT_INCREASED) if (flags & MF_COUNT_INCREASED)
put_page(page); put_page(page);
return -EBUSY; return 0;
} }
get_online_mems(); get_online_mems();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册