}
 
        if (PageTransHuge(hpage)) {
+               /*
+                * Bail out before SetPageHasHWPoisoned() if hpage is
+                * huge_zero_page, although PG_has_hwpoisoned is not
+                * checked in set_huge_zero_page().
+                *
+                * TODO: Handle memory failure of huge_zero_page thoroughly.
+                */
+               if (is_huge_zero_page(hpage)) {
+                       action_result(pfn, MF_MSG_UNSPLIT_THP, MF_IGNORED);
+                       res = -EBUSY;
+                       goto unlock_mutex;
+               }
+
                /*
                 * The flag must be set after the refcount is bumped
                 * otherwise it may race with THP split.