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:
parent
67ff51c6a6
commit
357670f79e
@ -1404,26 +1404,22 @@ 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);
|
||||
if (PageHuge(hpage) && !PageAnon(hpage)) {
|
||||
/*
|
||||
* For hugetlb pages in shared mappings, try_to_unmap
|
||||
* could potentially call huge_pmd_unshare. Because of
|
||||
* this, take semaphore in write mode here and set
|
||||
* TTU_RMAP_LOCKED to indicate we have taken the lock
|
||||
* at this higher level.
|
||||
*/
|
||||
mapping = hugetlb_page_mapping_lock_write(hpage);
|
||||
if (mapping) {
|
||||
try_to_unmap(hpage, ttu|TTU_RMAP_LOCKED);
|
||||
i_mmap_unlock_write(mapping);
|
||||
} else
|
||||
pr_info("Memory failure: %#lx: could not lock mapping for mapped huge page\n", pfn);
|
||||
} else {
|
||||
if (!PageAnon(hpage)) {
|
||||
/*
|
||||
* For hugetlb pages in shared mappings, try_to_unmap
|
||||
* could potentially call huge_pmd_unshare. Because of
|
||||
* this, take semaphore in write mode here and set
|
||||
* TTU_RMAP_LOCKED to indicate we have taken the lock
|
||||
* at this higher level.
|
||||
*/
|
||||
mapping = hugetlb_page_mapping_lock_write(hpage);
|
||||
if (mapping) {
|
||||
try_to_unmap(hpage, ttu|TTU_RMAP_LOCKED);
|
||||
i_mmap_unlock_write(mapping);
|
||||
} else
|
||||
pr_info("Memory failure: %#lx: could not lock mapping for mapped huge page\n", pfn);
|
||||
} else {
|
||||
try_to_unmap(hpage, ttu);
|
||||
}
|
||||
try_to_unmap(hpage, ttu);
|
||||
}
|
||||
|
||||
unmap_success = !page_mapped(hpage);
|
||||
|
Loading…
Reference in New Issue
Block a user