Skip to content

Commit 5a2ffca

Browse files
osalvadorvilardagatorvalds
authored andcommitted
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 <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Acked-by: Naoya Horiguchi <[email protected]> Cc: "Aneesh Kumar K.V" <[email protected]> Cc: Aneesh Kumar K.V <[email protected]> Cc: Aristeu Rozanski <[email protected]> Cc: Dave Hansen <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Dmitry Yakunin <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Kravetz <[email protected]> Cc: Oscar Salvador <[email protected]> Cc: Qian Cai <[email protected]> Cc: Tony Luck <[email protected]> Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Linus Torvalds <[email protected]>
1 parent 6b9a217 commit 5a2ffca

File tree

2 files changed

+2
-7
lines changed

2 files changed

+2
-7
lines changed

mm/madvise.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -896,11 +896,6 @@ static int madvise_inject_error(int behavior,
896896
*/
897897
size = page_size(compound_head(page));
898898

899-
if (PageHWPoison(page)) {
900-
put_page(page);
901-
continue;
902-
}
903-
904899
if (behavior == MADV_SOFT_OFFLINE) {
905900
pr_info("Soft offlining pfn %#lx at process virtual address %#lx\n",
906901
pfn, start);

mm/memory-failure.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1802,7 +1802,7 @@ static int __soft_offline_page(struct page *page)
18021802
unlock_page(page);
18031803
put_page(page);
18041804
pr_info("soft offline: %#lx page already poisoned\n", pfn);
1805-
return -EBUSY;
1805+
return 0;
18061806
}
18071807

18081808
if (!PageHuge(page))
@@ -1906,7 +1906,7 @@ int soft_offline_page(unsigned long pfn, int flags)
19061906
pr_info("soft offline: %#lx page already poisoned\n", pfn);
19071907
if (flags & MF_COUNT_INCREASED)
19081908
put_page(page);
1909-
return -EBUSY;
1909+
return 0;
19101910
}
19111911

19121912
get_online_mems();

0 commit comments

Comments
 (0)