diff options
author | Ingo Molnar <mingo@kernel.org> | 2021-02-17 14:04:39 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2021-02-17 14:04:39 +0100 |
commit | ed3cd45f8ca873dd320ff7e6b4c1c8f83a65302c (patch) | |
tree | 783a02c1e78964654fe6d9a9c14b24bfc50e6b3b /mm/memory-failure.c | |
parent | bae4ec13640b0915e7dd86da7e65c5d085160571 (diff) | |
parent | f40ddce88593482919761f74910f42f4b84c004b (diff) | |
download | linux-ed3cd45f8ca873dd320ff7e6b4c1c8f83a65302c.tar.gz linux-ed3cd45f8ca873dd320ff7e6b4c1c8f83a65302c.tar.bz2 linux-ed3cd45f8ca873dd320ff7e6b4c1c8f83a65302c.zip |
Merge tag 'v5.11' into sched/core, to pick up fixes & refresh the branch
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'mm/memory-failure.c')
-rw-r--r-- | mm/memory-failure.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 5a38e9eade94..e9481632fcd1 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1885,6 +1885,12 @@ static int soft_offline_free_page(struct page *page) return rc; } +static void put_ref_page(struct page *page) +{ + if (page) + put_page(page); +} + /** * soft_offline_page - Soft offline a page. * @pfn: pfn to soft-offline @@ -1910,20 +1916,26 @@ static int soft_offline_free_page(struct page *page) int soft_offline_page(unsigned long pfn, int flags) { int ret; - struct page *page; bool try_again = true; + struct page *page, *ref_page = NULL; + + WARN_ON_ONCE(!pfn_valid(pfn) && (flags & MF_COUNT_INCREASED)); if (!pfn_valid(pfn)) return -ENXIO; + if (flags & MF_COUNT_INCREASED) + ref_page = pfn_to_page(pfn); + /* Only online pages can be soft-offlined (esp., not ZONE_DEVICE). */ page = pfn_to_online_page(pfn); - if (!page) + if (!page) { + put_ref_page(ref_page); return -EIO; + } if (PageHWPoison(page)) { pr_info("%s: %#lx page already poisoned\n", __func__, pfn); - if (flags & MF_COUNT_INCREASED) - put_page(page); + put_ref_page(ref_page); return 0; } @@ -1940,7 +1952,7 @@ retry: goto retry; } } else if (ret == -EIO) { - pr_info("%s: %#lx: unknown page type: %lx (%pGP)\n", + pr_info("%s: %#lx: unknown page type: %lx (%pGp)\n", __func__, pfn, page->flags, &page->flags); } |