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>
 
                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);
                freeit = !!TestClearPageHWPoison(p);
 
                put_page(page);
-               if (freeit && !(pfn == my_zero_pfn(0) && page_count(p) == 1)) {
+               if (freeit) {
                        put_page(page);
                        ret = 0;
                }