diff --git a/mm/memory-failure.c b/mm/memory-failure.c index a7b8ccd29b6f52..02be0596ce6730 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -2556,10 +2556,18 @@ int unpoison_memory(unsigned long pfn) static DEFINE_RATELIMIT_STATE(unpoison_rs, DEFAULT_RATELIMIT_INTERVAL, DEFAULT_RATELIMIT_BURST); - if (!pfn_valid(pfn)) - return -ENXIO; + p = pfn_to_online_page(pfn); + if (!p) { + struct dev_pagemap *pgmap; - p = pfn_to_page(pfn); + if (!pfn_valid(pfn)) + return -ENXIO; + pgmap = get_dev_pagemap(pfn, NULL); + if (!pgmap) + return -ENXIO; + put_dev_pagemap(pgmap); + p = pfn_to_page(pfn); + } folio = page_folio(p); mutex_lock(&mf_mutex);