FAILED: patch "[PATCH] mm/migrate_device: clear stale mapping after freeing" failed to apply to 6.18-stable tree
Subsystems (3)
[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 34a00895d032a414830d41106a09329ae6c251b6
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090342-staging-boned-79f6@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 34a00895d032a414830d41106a09329ae6c251b6 Mon Sep 17 00:00:00 2001
From: Arvind Yadav <[email protected]>
Date: Tue, 28 Jul 2026 11:58:32 +0530
Subject: [PATCH] mm/migrate_device: clear stale mapping after freeing
swapcache
__migrate_device_pages() reads the folio mapping before calling folio_free_swap(). When folio_free_swap() succeeds, the folio is removed from the swap cache, but the saved mapping still points to swap_space.
Passing the stale mapping to folio_migrate_mapping() makes it use the mapped-folio path for a folio that is no longer in swapcache. It can then operate on swap_space.i_pages with invalid reference accounting, eventually triggering a folio reference count BUG.
After a successful split, nr still contains the number of pages in the original large folio, although each resulting page is now a separate order-0 folio. Reset nr to 1 so each split folio is processed separately, including its own swapcache removal and mapping lookup.
Refresh the saved mapping after folio_free_swap() so the current folio state is used during migration.
mm/migrate_device.c +13 -0
@@ -1193,6 +1193,13 @@ static void __migrate_device_pages(unsigned long *src_pfns, MIGRATE_PFN_COMPOUND); goto next; } + +/* +* reset nr so that only first after-split folio +* is processed below +*/ +VM_WARN_ON_ONCE (folio_test_large (folio)); + nr =1 ; }else if ((src_pfns[i] &MIGRATE_PFN_MIGRATE ) && (dst_pfns[i] &MIGRATE_PFN_COMPOUND ) && !(src_pfns[i] &MIGRATE_PFN_COMPOUND )) {
@@ -1232,6 +1239,12 @@ static void __migrate_device_pages(unsigned long *src_pfns, folio =page_folio (migrate_pfn_to_page (src_pfns[i+j])); newfolio =page_folio (migrate_pfn_to_page (dst_pfns[i+j])); +/* +* folio_free_swap() removed the folio from the swap +* cache. Refresh the saved mapping before migration. +*/ + mapping =folio_mapping (folio); + r =folio_migrate_mapping (mapping, newfolio, folio, extra_cnt);if (r) src_pfns[i+j] &= ~MIGRATE_PFN_MIGRATE ;