]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
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>
Fri, 26 Aug 2022 05:03:06 +0000 (22:03 -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>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/memory-failure.c

index aba275bbf07ed3b91c7229a87057463356a0251c..869e0c241e045327d4df505a8794c3a4fe22ded3 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;
                }