FAILED: patch "[PATCH] mm/huge_memory: fix folio isn't locked in softleaf_to_folio()" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 4ff07459db888054f68575646d7fe04f31f1e56d
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026050331-napped-catnap-947d@gregkh' --subject-prefix 'PATCH 6.18.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 4ff07459db888054f68575646d7fe04f31f1e56d Mon Sep 17 00:00:00 2001
From: Jinjiang Tu <[email protected]>
Date: Thu, 19 Mar 2026 09:25:41 +0800
Subject: [PATCH] mm/huge_memory: fix folio isn't locked in softleaf_to_folio()
On arm64 server, we found folio that get from migration entry isn't locked in softleaf_to_folio(). This issue triggers when mTHP splitting and zap_nonpresent_ptes() races, and the root cause is lack of memory barrier in softleaf_to_folio(). The race is as follows:
CPU0 CPU1
deferred_split_scan() zap_nonpresent_ptes()
lock folio
split_folio()
unmap_folio()
change ptes to migration entries
__split_folio_to_order() softleaf_to_folio()
set flags(including PG_locked) for tail pages folio = pfn_folio(softleaf_to_pfn(entry))
smp_wmb() VM_WARN_ON_ONCE(!folio_test_locked(folio))
prep_compound_page() for tail pages
In __split_folio_to_order(), smp_wmb() guarantees page flags of tail pages are visible before the tail page becomes non-compound. smp_wmb() should be paired with smp_rmb() in softleaf_to_folio(), which is missed. As a result, if zap_nonpresent_ptes() accesses migration entry that stores tail pfn, softleaf_to_folio() may see the updated compound_head of tail page before page->flags.
This issue will trigger VM_WARN_ON_ONCE() in pfn_swap_entry_folio() because of the race between folio split and zap_nonpresent_ptes() leading to a folio incorrectly undergoing modification without a folio lock being held.
This is a BUG_ON() before commit 93976a20345b ("mm: eliminate further swapops predicates"), which in merged in v6.19-rc1.
To fix it, add missing smp_rmb() if the softleaf entry is migration entry in softleaf_to_folio() and softleaf_to_page().
include/linux/leafops.h +21 -11
@@ -363,6 +363,23 @@ static inline unsigned long softleaf_to_pfn(softleaf_t entry)return swp_offset (entry) &SWP_PFN_MASK ; } +static inline void softleaf_migration_sync (softleaf_t entry, +struct folio *folio) +{ +/* +* Ensure we do not race with split, which might alter tail pages into new +* folios and thus result in observing an unlocked folio. +* This matches the write barrier in __split_folio_to_order(). +*/ +smp_rmb (); + +/* +* Any use of migration entries may only occur while the +* corresponding page is locked +*/ +VM_WARN_ON_ONCE (!folio_test_locked (folio)); +} +/** * softleaf_to_page() - Obtains struct page for PFN encoded within leaf entry. * @entry: Leaf entry, softleaf_has_pfn(@entry) must return true.
@@ -374,11 +391,8 @@ static inline struct page *softleaf_to_page(softleaf_t entry)struct page *page =pfn_to_page (softleaf_to_pfn (entry));VM_WARN_ON_ONCE (!softleaf_has_pfn (entry)); -/* -* Any use of migration entries may only occur while the -* corresponding page is locked -*/ -VM_WARN_ON_ONCE (softleaf_is_migration (entry) && !PageLocked (page)); +if (softleaf_is_migration (entry)) +softleaf_migration_sync (entry,page_folio (page));return page; }
@@ -394,12 +408,8 @@ static inline struct folio *softleaf_to_folio(softleaf_t entry)struct folio *folio =pfn_folio (softleaf_to_pfn (entry));VM_WARN_ON_ONCE (!softleaf_has_pfn (entry)); -/* -* Any use of migration entries may only occur while the -* corresponding folio is locked. -*/ -VM_WARN_ON_ONCE (softleaf_is_migration (entry) && - !folio_test_locked (folio)); +if (softleaf_is_migration (entry)) +softleaf_migration_sync (entry, folio);return folio; }