mm, hwpoison: avoid trying to unpoison reserved page
authorMiaohe Lin <linmiaohe@huawei.com>
Thu, 18 Aug 2022 13:00:16 +0000 (21:00 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 12 Sep 2022 03:25:58 +0000 (20:25 -0700)
For reserved pages, HWPoison flag will be set without increasing the page
refcnt.  So we shouldn't even try to unpoison these pages and thus
decrease the page refcnt unexpectly.  Add a PageReserved() check to filter
this case out and remove the below unneeded zero page (zero page is
reserved) check.

Link: https://lkml.kernel.org/r/20220818130016.45313-7-linmiaohe@huawei.com
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Acked-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/memory-failure.c

index 3b8e793..8156ef0 100644 (file)
@@ -2351,7 +2351,7 @@ int unpoison_memory(unsigned long pfn)
                goto unlock_mutex;
        }
 
-       if (PageSlab(page) || PageTable(page))
+       if (PageSlab(page) || PageTable(page) || PageReserved(page))
                goto unlock_mutex;
 
        ret = get_hwpoison_page(p, MF_UNPOISON);
@@ -2382,7 +2382,7 @@ int unpoison_memory(unsigned long pfn)
                freeit = !!TestClearPageHWPoison(p);
 
                put_page(page);
-               if (freeit && !(pfn == my_zero_pfn(0) && page_count(p) == 1)) {
+               if (freeit) {
                        put_page(page);
                        ret = 0;
                }