On 18.03.22 08:39, Miaohe Lin wrote: > We can not really handle non-LRU movable pages in memory failure. Typically > they are balloon, zsmalloc, etc. Assuming we run into a base (4K) non-LRU > movable page, we could reach as far as identify_page_state(), it should not > fall into any category except me_unknown. For the non-LRU compound movable > pages, they could be taken for transhuge pages but it's unexpected to split > non-LRU movable pages using split_huge_page_to_list in memory_failure. So > we could just simply make non-LRU movable pages unhandlable to avoid these > possible nasty cases. > > Suggested-by: Yang Shi <shy828301@xxxxxxxxx> > Signed-off-by: Miaohe Lin <linmiaohe@xxxxxxxxxx> > Reviewed-by: Yang Shi <shy828301@xxxxxxxxx> > Acked-by: Naoya Horiguchi <naoya.horiguchi@xxxxxxx> > --- > mm/memory-failure.c | 20 +++++++++++++------- > 1 file changed, 13 insertions(+), 7 deletions(-) > > diff --git a/mm/memory-failure.c b/mm/memory-failure.c > index ecf45961f3b6..bf14bea2ed93 100644 > --- a/mm/memory-failure.c > +++ b/mm/memory-failure.c > @@ -1176,12 +1176,18 @@ void ClearPageHWPoisonTakenOff(struct page *page) > * does not return true for hugetlb or device memory pages, so it's assumed > * to be called only in the context where we never have such pages. > */ > -static inline bool HWPoisonHandlable(struct page *page) > +static inline bool HWPoisonHandlable(struct page *page, unsigned long flags) > { > - return PageLRU(page) || __PageMovable(page) || is_free_buddy_page(page); > + bool movable = false; > + > + /* Soft offline could mirgate non-LRU movable pages */ s/mirgate/migrate/ > + if ((flags & MF_SOFT_OFFLINE) && __PageMovable(page)) > + movable = true; simply "return true" and drop "bool movable". > + > + return movable || PageLRU(page) || is_free_buddy_page(page); -- Thanks, David / dhildenb