mm-clarify-the-folio_free_swap-for-do_swap_page.patch removed from -mm tree
The quilt patch titled
Subject: mm: clarify the folio_free_swap() for do_swap_page()
has been removed from the -mm tree. Its filename was
mm-clarify-the-folio_free_swap-for-do_swap_page.patch
This patch was dropped because it was merged into the mm-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
------------------------------------------------------
From: "Barry Song (Xiaomi)" <[email protected]>
Subject: mm: clarify the folio_free_swap() for do_swap_page()
Date: Thu, 2 Jul 2026 07:59:55 +0800
Since commit 4b34f1d82c654 ("mm, swap: free the swap cache after folio is mapped"), we have relied on do_wp_page() to handle the non-exclusive case, where the folio may either be reused or require CoW.
As a result, using the refcount in do_swap_page() to decide when to free the swap cache is no longer necessary, since do_wp_page() can handle this more cleanly and consistently.
We can now simply use FAULT_FLAG_WRITE together with exclusivity to decide when to free the swap cache in do_swap_page().
---
mm/memory.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)
mm/memory.c renamed from mm/memory.c~mm-clarify-the-folio_free_swap-for-do_swap_page +8 -12
@@ -4509,7 +4509,7 @@ static vm_fault_t remove_device_exclusivstatic inline bool should_try_to_free_swap (struct swap_info_struct *si,struct folio *folio,struct vm_area_struct *vma, -unsigned int extra_refs, +bool exclusive,unsigned int fault_flags) {if (!folio_test_swapcache (folio))
@@ -4525,14 +4525,12 @@ static inline bool should_try_to_free_swif (mem_cgroup_swap_full (folio) || (vma->vm_flags &VM_LOCKED ) ||folio_test_mlocked (folio))return true; +/* -* If we want to map a page that's in the swapcache writable, we -* have to detect via the refcount if we're really the exclusive -* user. Try freeing the swapcache to get rid of the swapcache -* reference only in case it's likely that we'll be the exclusive user. +* Free the swapcache only if we are the exclusive user and +* this is a write fault. */ -return (fault_flags &FAULT_FLAG_WRITE ) && !folio_test_ksm (folio) && -folio_ref_count (folio) == (extra_refs +folio_nr_pages (folio)); +return (fault_flags &FAULT_FLAG_WRITE ) && exclusive; }static vm_fault_t pte_marker_clear (struct vm_fault *vmf)
@@ -5036,10 +5034,8 @@ check_folio:if ((vma->vm_flags &VM_WRITE ) && !userfaultfd_pte_wp (vma, pte) && !pte_needs_soft_dirty_wp (vma, pte)) { pte =pte_mkwrite (pte, vma); -if (vmf->flags &FAULT_FLAG_WRITE ) { +if (vmf->flags &FAULT_FLAG_WRITE ) pte =pte_mkdirty (pte); - vmf->flags &= ~FAULT_FLAG_WRITE ; - } } rmap_flags |=RMAP_EXCLUSIVE ; }
@@ -5079,7 +5075,7 @@ check_folio:* Do it after mapping, so raced page faults will likely see the folio * in swap cache and wait on the folio lock. */ -if (should_try_to_free_swap (si, folio, vma, nr_pages, vmf->flags)) +if (should_try_to_free_swap (si, folio, vma, exclusive, vmf->flags))folio_free_swap (folio);folio_unlock (folio);
@@ -5096,7 +5092,7 @@ check_folio:folio_put (swapcache); } -if (vmf->flags &FAULT_FLAG_WRITE ) { +if ((vmf->flags &FAULT_FLAG_WRITE ) && !pte_write (pte)) { ret |=do_wp_page (vmf);if (ret &VM_FAULT_ERROR ) ret &=VM_FAULT_ERROR ;
_
Patches currently in -mm which might be from [email protected] are
arm64-hugetlb-extend-batching-of-multiple-cont_pte-in-a-single-pte-setup.patch arm64-vmalloc-allow-arch_vmap_pte_range_map_size-to-batch-multiple-cont_pte.patch mm-vmalloc-extend-page-table-walk-to-support-larger-page_shift-sizes-and-eliminate-page-table-rewalk.patch mm-vmalloc-map-contiguous-pages-in-batches-for-vmap-if-possible.patch mm-vmalloc-align-vm_area-so-vmap-can-batch-mappings.patch