swp_entry_t entry;
 
                        entry = pte_to_swp_entry(ptent);
-                       if (non_swap_entry(entry))
-                               continue;
-                       nr_swap--;
-                       free_swap_and_cache(entry);
-                       pte_clear_not_present_full(mm, addr, pte, tlb->fullmm);
+                       if (!non_swap_entry(entry)) {
+                               nr_swap--;
+                               free_swap_and_cache(entry);
+                               pte_clear_not_present_full(mm, addr, pte, tlb->fullmm);
+                       } else if (is_hwpoison_entry(entry) ||
+                                  is_swapin_error_entry(entry)) {
+                               pte_clear_not_present_full(mm, addr, pte, tlb->fullmm);
+                       }
                        continue;
                }