mm,hwpoison: return 0 if the page is already poisoned in soft-offline
Currently, there is an inconsistency when calling soft-offline from different paths on a page that is already poisoned. 1) madvise: madvise_inject_error skips any poisoned page and continues the loop. If that was the only page to madvise, it returns 0. 2) /sys/devices/system/memory/: When calling soft_offline_page_store()->soft_offline_page(), we return -EBUSY in case the page is already poisoned. This is inconsistent with a) the above example and b) memory_failure, where we return 0 if the page was poisoned. Fix this by dropping the PageHWPoison() check in madvise_inject_error, and let soft_offline_page return 0 if it finds the page already poisoned. Please, note that this represents a user-api change, since now the return error when calling soft_offline_page_store()->soft_offline_page() will be different. Signed-off-by: Oscar Salvador <osalvador@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Acked-by: Naoya Horiguchi <naoya.horiguchi@nec.com> Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Cc: Aristeu Rozanski <aris@ruivo.org> Cc: Dave Hansen <dave.hansen@intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: Dmitry Yakunin <zeil@yandex-team.ru> Cc: Michal Hocko <mhocko@kernel.org> Cc: Mike Kravetz <mike.kravetz@oracle.com> Cc: Oscar Salvador <osalvador@suse.com> Cc: Qian Cai <cai@lca.pw> Cc: Tony Luck <tony.luck@intel.com> Link: https://lkml.kernel.org/r/20200922135650.1634-12-osalvador@suse.de Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
6b9a217eda
commit
5a2ffca3c2
@ -896,11 +896,6 @@ static int madvise_inject_error(int behavior,
|
||||
*/
|
||||
size = page_size(compound_head(page));
|
||||
|
||||
if (PageHWPoison(page)) {
|
||||
put_page(page);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (behavior == MADV_SOFT_OFFLINE) {
|
||||
pr_info("Soft offlining pfn %#lx at process virtual address %#lx\n",
|
||||
pfn, start);
|
||||
|
@ -1802,7 +1802,7 @@ static int __soft_offline_page(struct page *page)
|
||||
unlock_page(page);
|
||||
put_page(page);
|
||||
pr_info("soft offline: %#lx page already poisoned\n", pfn);
|
||||
return -EBUSY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!PageHuge(page))
|
||||
@ -1906,7 +1906,7 @@ int soft_offline_page(unsigned long pfn, int flags)
|
||||
pr_info("soft offline: %#lx page already poisoned\n", pfn);
|
||||
if (flags & MF_COUNT_INCREASED)
|
||||
put_page(page);
|
||||
return -EBUSY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
get_online_mems();
|
||||
|
Loading…
Reference in New Issue
Block a user