mm/memory-failure.c: rework the try_to_unmap logic in hwpoison_user_mappings()

Only for hugetlb pages in shared mappings, try_to_unmap should take
semaphore in write mode here.  Rework the code to make it clear.

Link: https://lkml.kernel.org/r/20220218090118.1105-7-linmiaohe@huawei.com
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Acked-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Miaohe Lin 2022-03-22 14:44:27 -07:00 committed by Linus Torvalds
parent 67ff51c6a6
commit 357670f79e

View File

@ -1404,10 +1404,7 @@ static bool hwpoison_user_mappings(struct page *p, unsigned long pfn,
if (kill)
collect_procs(hpage, &tokill, flags & MF_ACTION_REQUIRED);
if (!PageHuge(hpage)) {
try_to_unmap(hpage, ttu);
} else {
if (!PageAnon(hpage)) {
if (PageHuge(hpage) && !PageAnon(hpage)) {
/*
* For hugetlb pages in shared mappings, try_to_unmap
* could potentially call huge_pmd_unshare. Because of
@ -1424,7 +1421,6 @@ static bool hwpoison_user_mappings(struct page *p, unsigned long pfn,
} else {
try_to_unmap(hpage, ttu);
}
}
unmap_success = !page_mapped(hpage);
if (!unmap_success)