From: Miaohe Lin Date: Sat, 1 Jul 2023 07:28:37 +0000 (+0800) Subject: mm: memory-failure: fix potential page refcnt leak in memory_failure() X-Git-Tag: v6.6.7~1970^2~74 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d51b68469bc7804c34622f7f3d4889628d37cfd6;p=platform%2Fkernel%2Flinux-starfive.git mm: memory-failure: fix potential page refcnt leak in memory_failure() put_ref_page() is not called to drop extra refcnt when comes from madvise in the case pfn is valid but pgmap is NULL leading to page refcnt leak. Link: https://lkml.kernel.org/r/20230701072837.1994253-1-linmiaohe@huawei.com Fixes: 1e8aaedb182d ("mm,memory_failure: always pin the page in madvise_inject_error") Signed-off-by: Miaohe Lin Acked-by: Naoya Horiguchi Signed-off-by: Andrew Morton --- diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 55dfe8a..881c35ef 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -2117,8 +2117,6 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, { int rc = -ENXIO; - put_ref_page(pfn, flags); - /* device metadata space is not recoverable */ if (!pgmap_pfn_valid(pgmap, pfn)) goto out; @@ -2193,6 +2191,7 @@ int memory_failure(unsigned long pfn, int flags) if (pfn_valid(pfn)) { pgmap = get_dev_pagemap(pfn, NULL); + put_ref_page(pfn, flags); if (pgmap) { res = memory_failure_dev_pagemap(pfn, flags, pgmap);