提交 626d06a2 编写于 作者: M Miaohe Lin 提交者: Yongqiang Liu

mm/memory-failure.c: fix race with changing page more robustly

mainline inclusion
from mainline-v5.18-rc1
commit 75ee64b3
category: bugfix
bugzilla: 188200, https://gitee.com/openeuler/kernel/issues/I68OOI
CVE: NA

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

We're only intended to deal with the non-Compound page after we split
thp in memory_failure.  However, the page could have changed compound
pages due to race window.  If this happens, we could retry once to
hopefully handle the page next round.  Also remove unneeded orig_head.
It's always equal to the hpage.  So we can use hpage directly and remove
this redundant one.

Link: https://lkml.kernel.org/r/20220218090118.1105-5-linmiaohe@huawei.comSigned-off-by: NMiaohe Lin <linmiaohe@huawei.com>
Acked-by: NNaoya Horiguchi <naoya.horiguchi@nec.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: NMa Wupeng <mawupeng1@huawei.com>
Reviewed-by: NKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: NYongqiang Liu <liuyongqiang13@huawei.com>
上级 f0c2fbe9
...@@ -1345,7 +1345,6 @@ int memory_failure(unsigned long pfn, int flags) ...@@ -1345,7 +1345,6 @@ int memory_failure(unsigned long pfn, int flags)
{ {
struct page *p; struct page *p;
struct page *hpage; struct page *hpage;
struct page *orig_head;
struct dev_pagemap *pgmap; struct dev_pagemap *pgmap;
int res = 0; int res = 0;
unsigned long page_flags; unsigned long page_flags;
...@@ -1383,7 +1382,7 @@ int memory_failure(unsigned long pfn, int flags) ...@@ -1383,7 +1382,7 @@ int memory_failure(unsigned long pfn, int flags)
goto unlock_mutex; goto unlock_mutex;
} }
orig_head = hpage = compound_head(p); hpage = compound_head(p);
num_poisoned_pages_inc(); num_poisoned_pages_inc();
/* /*
...@@ -1443,10 +1442,21 @@ int memory_failure(unsigned long pfn, int flags) ...@@ -1443,10 +1442,21 @@ int memory_failure(unsigned long pfn, int flags)
lock_page(p); lock_page(p);
/* /*
* The page could have changed compound pages during the locking. * We're only intended to deal with the non-Compound page here.
* If this happens just bail out. * However, the page could have changed compound pages due to
* race window. If this happens, we could try again to hopefully
* handle the page next round.
*/ */
if (PageCompound(p) && compound_head(p) != orig_head) { if (PageCompound(p)) {
if (retry) {
if (TestClearPageHWPoison(p))
num_poisoned_pages_dec();
unlock_page(p);
put_page(p);
flags &= ~MF_COUNT_INCREASED;
retry = false;
goto try_again;
}
action_result(pfn, MF_MSG_DIFFERENT_COMPOUND, MF_IGNORED); action_result(pfn, MF_MSG_DIFFERENT_COMPOUND, MF_IGNORED);
res = -EBUSY; res = -EBUSY;
goto unlock_page; goto unlock_page;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册