On Thu, Oct 17, 2019 at 04:21:21PM +0200, Oscar Salvador wrote: > 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/: > > Whe 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 an 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@xxxxxxx> Looks good to me. Acked-by: Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> > --- > mm/madvise.c | 3 --- > mm/memory-failure.c | 4 ++-- > 2 files changed, 2 insertions(+), 5 deletions(-) > > diff --git a/mm/madvise.c b/mm/madvise.c > index 8a0b1f901d72..9ca48345ce45 100644 > --- a/mm/madvise.c > +++ b/mm/madvise.c > @@ -887,9 +887,6 @@ static int madvise_inject_error(int behavior, > */ > put_page(page); > > - if (PageHWPoison(page)) > - continue; > - > if (behavior == MADV_SOFT_OFFLINE) { > pr_info("Soft offlining pfn %#lx at process virtual address %#lx\n", > pfn, start); > diff --git a/mm/memory-failure.c b/mm/memory-failure.c > index 3d491c0d3f91..c038896bedf0 100644 > --- a/mm/memory-failure.c > +++ b/mm/memory-failure.c > @@ -1767,7 +1767,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)) > @@ -1866,7 +1866,7 @@ int soft_offline_page(struct page *page) > > if (PageHWPoison(page)) { > pr_info("soft offline: %#lx page already poisoned\n", pfn); > - return -EBUSY; > + return 0; > } > > get_online_mems(); > -- > 2.12.3 > >