mm: memory-failure: kill __soft_offline_page()

Squash the __soft_offline_page() into soft_offline_in_use_page() and kill
__soft_offline_page().

[wangkefeng.wang@huawei.com: update hpage when try_to_split_thp_page() succeeds]
  Link: https://lkml.kernel.org/r/20220830104654.28234-1-wangkefeng.wang@huawei.com
Link: https://lkml.kernel.org/r/20220819033402.156519-2-wangkefeng.wang@huawei.com
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: Miaohe Lin <linmiaohe@huawei.com>
Acked-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Kefeng Wang 2022-08-19 11:34:02 +08:00 committed by Andrew Morton
parent 7adb45887c
commit 48309e1f6f
1 changed files with 10 additions and 15 deletions

View File

@ -2432,11 +2432,11 @@ static bool isolate_page(struct page *page, struct list_head *pagelist)
}
/*
* __soft_offline_page handles hugetlb-pages and non-hugetlb pages.
* soft_offline_in_use_page handles hugetlb-pages and non-hugetlb pages.
* If the page is a non-dirty unmapped page-cache page, it simply invalidates.
* If the page is mapped, it migrates the contents over.
*/
static int __soft_offline_page(struct page *page)
static int soft_offline_in_use_page(struct page *page)
{
long ret = 0;
unsigned long pfn = page_to_pfn(page);
@ -2449,6 +2449,14 @@ static int __soft_offline_page(struct page *page)
.gfp_mask = GFP_USER | __GFP_MOVABLE | __GFP_RETRY_MAYFAIL,
};
if (!huge && PageTransHuge(hpage)) {
if (try_to_split_thp_page(page)) {
pr_info("soft offline: %#lx: thp split failed\n", pfn);
return -EBUSY;
}
hpage = page;
}
lock_page(page);
if (!PageHuge(page))
wait_on_page_writeback(page);
@ -2498,19 +2506,6 @@ static int __soft_offline_page(struct page *page)
return ret;
}
static int soft_offline_in_use_page(struct page *page)
{
struct page *hpage = compound_head(page);
if (!PageHuge(page) && PageTransHuge(hpage))
if (try_to_split_thp_page(page) < 0) {
pr_info("soft offline: %#lx: thp split failed\n",
page_to_pfn(page));
return -EBUSY;
}
return __soft_offline_page(page);
}
static void put_ref_page(struct page *page)
{
if (page)