Re: [PATCH] mm/memory-failure: fix folio refcount leak and min_order_for_split() locking
From: Baolin Wang
Date: Thu Aug 06 2026 - 21:50:01 EST
On 8/6/26 7:14 PM, David Hildenbrand (Arm) wrote:
hwpoison code can end up calling min_order_for_split() without holding
the folio lock. There isn't really something that would prevent
concurrent folio split. Consequently folio->mapping can get set to
NULL after checking for "!folio->mapping", and if the compiler
reloads folio->mapping, mapping_min_folio_order() would try to
dereference NULL.
While very unlikely to happen in practice, let's just enforce that
min_order_for_split() is called with the folio lock held. We can
significantly cleanup the calling hwpoison code, and just get rid
of try_to_split_thp_page() to hold the folio lock for a bit longer.
Just work on folios now, which further cleans up the code. We just
have to be careful about doing the page_folio() after splitting, which
we have to do already either way. Do not change the way we split for
now, this needs more thought and should be done separately.
Cleaning this up we fix another issue: in soft_offline_in_use_page(), we
would currently have leaked a folio reference.
In folio_split(), document and assert that we need the folio lock.
Drop the questionable VM_BUG_ON_PAGE(!page_count(p), p) check entirely.
The folio->mapping problem was identified by Sashiko, and Li Youhong
reported it by sending a proposal fix.
This likely does not really warrant CCing stable, but I expect little
conflicts when doing the backport, so let's just CC stable because of
the refcount leak.
Reported-by: Li Youhong <liyouhong@xxxxxxxxxx>
Closes: https://lore.kernel.org/r/20260804035828.2684059-1-dayou5941@xxxxxxx
Fixes: 689b8986776c ("mm/memory-failure: improve large block size folio handling")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: David Hildenbrand (Arm) <david@xxxxxxxxxx>
---
LGTM. Thanks.
Reviewed-by: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx>