mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Usama Arif <usama.arif@linux.dev>,
	Andrew Morton <akpm@linux-foundation.org>,
	chrisl@kernel.org, kasong@tencent.com, ljs@kernel.org,
	ziy@nvidia.com, linux-mm@kvack.org
Cc: ying.huang@linux.alibaba.com, Baoquan He <baoquan.he@linux.dev>,
	willy@infradead.org, youngjun.park@lge.com, hannes@cmpxchg.org,
	riel@surriel.com, shakeel.butt@linux.dev, alex@ghiti.fr,
	kas@kernel.org, baohua@kernel.org, dev.jain@arm.com,
	baolin.wang@linux.alibaba.com, Nico Pache <nico.pache@linux.dev>,
	"Liam R. Howlett" <liam@infradead.org>,
	ryan.roberts@arm.com, Vlastimil Babka <vbabka@kernel.org>,
	lance.yang@linux.dev, linux-kernel@vger.kernel.org,
	nphamcs@gmail.com, shikemeng@huaweicloud.com, yosry@kernel.org,
	qi.zheng@linux.dev, luizcap@redhat.com, kernel-team@meta.com
Subject: Re: [PATCH v8 00/30] mm: PMD-level swap entries for anonymous THPs
Date: Fri, 2 Oct 2026 16:28:37 +0200	[thread overview]
Message-ID: <ebc72eb7-daf3-45be-8994-b51e5e301b56@kernel.org> (raw)
In-Reply-To: <20261002095503.3585565-1-usama.arif@linux.dev>

On 10/2/26 11:52, Usama Arif wrote:
> When reclaim swaps out a PMD-mapped anonymous THP today, the PMD is
> split into HPAGE_PMD_NR PTE-level swap entries via TTU_SPLIT_HUGE_PMD
> before unmap.  This series introduces a PMD-level swap entry so the
> huge mapping can survive the swap round-trip and do_huge_pmd_swap_page()
> can restore the PMD mapping directly on swap-in, without waiting for
> khugepaged to collapse the range later.
> 
> The PMD swap entry is a compact page-table encoding for HPAGE_PMD_NR
> consecutive swap slots.  swap_map accounting remains per-slot and is
> unchanged.  Importantly, a PMD swap entry does not promise that the swap
> cache always contains one PMD-sized folio.  While the cache is empty or
> contains one PMD-sized folio, PMD-level handling can proceed.  Once the
> cache has split/per-slot state, users either inspect the individual
> slots directly (mincore) or split the PMD swap entry and retry through
> the PTE path (fault, swapoff, MADV_WILLNEED, UFFDIO_MOVE).  MADV_FREE
> does not consult the cache at all: it frees a whole PMD swap entry in
> place and only splits when the advised range covers part of the PMD.
> Likewise, if any slot is still backed by zswap's per-page
> store, PMD-order swap-in consumers split and let the PTE path load the
> range page by page; an all-on-disk range can still be read back as one
> PMD-sized folio.
> 
> The series is ordered so every consumer can handle PMD swap entries
> before the swap-out producer starts installing them.  The swap-out patch
> is the last functional change.
> 
> Performance:
> 
>   Measured with vm-scalability's case-swap-w-seq benchmark [1].  Four
>   pinned workers repeatedly write a 6 GiB anonymous working set on a
>   4 vCPU / 4 GiB guest, forcing the set out to swap and back in.  Swap
>   is an 8 GiB NOCOW raw virtio device (cache=none, aio=native), zswap is
>   disabled, and THP enabled/defrag are both "always".  The numbers below
>   are medians of five interleaved runs per kernel after one warm-up run:
> 
>   Metric                          Baseline     Patched      Change
>   Aggregate throughput            584.3 MiB/s  2408.9 MiB/s +312.2% (4.12x)
>   Elapsed time                    85.43 s      20.72 s      -75.7%
>   Major faults                    1,814,699    228,466      -87.4%
>   Swap I/O rate                   1.02 GiB/s   4.10 GiB/s   +303.9%
> 
>   This is a swap-intensive synthetic workload, so it mostly demonstrates
>   the reduction in swap-fault and page-table overhead from preserving
>   PMD mappings.  I don't want to use sythetic workloads to show benefits
>   of the series. IMHO, the main advantage comes from long-running
>   workloads I expect the bigger win to come from fewer TLB misses,
>   less khugepaged work, and less kernel churn from larger folios, although
>   I have not found a benchmark that captures that well.  PMD swap entries
>   also move us closer to eliminating page-table deposits for anonymous THPs,
>   which would provide memory savings.
> 
> Sashiko reviews on intermediate patches:
> 
>   Because the swap-out producer is the last functional patch, the
>   consumer code added by the patches before it is unreachable at the
>   point it is introduced.  Every previous sashiko review has reported
>   that code as broken on the basis of a state it cannot yet be in; the
>   series is ordered this way deliberately.  See [2].
> 
> Notes on zswap:
> 
>   Native PMD-order zswap load/store is intentionally left for a follow-up.
>   Alexandre Ghiti is currently working on this.
>   This series can still preserve PMD swap entries while zswap is enabled:
>   zswap stores the THP as order-0 entries, and PMD-order swap-in
>   consumers split any range that has zswap entries before reading it.  If
>   zswap has written the whole range back to disk, or the swap cache still
>   contains one PMD-sized folio, PMD-level handling can proceed.
> 
> Testing:
> 
>   The 17 pmd_swap selftests pass on x86_64 with zswap both disabled and
>   enabled.  PMD_SWAP_DEVICE was the sole active swap device, so the
>   swapoff test ran in both configurations.  Note that with zswap enabled
>   the range may legitimately come back through the PTE fallback, so those
>   runs skip the PMD-restoration assertions and say so in the log; the
>   zswap-disabled run is the one that proves PMD restoration.
> 
>   hmm-tests was run with CONFIG_DEBUG_VM=y and panic_on_warn=1, both on
>   this series and on the base commit: identical results either way
>   (pass:35 fail:3 skip:40).  The three failures are O_TMPFILE on the
>   test VM's 9p /tmp, not kernel behaviour, and the THP paths
>   (migrate_anon_huge_*, migrate_partial_unmap_fault,
>   benchmark_thp_migration) pass.
> 
> [1] https://git.kernel.org/pub/scm/linux/kernel/git/wfg/vm-scalability.git/tree/case-swap-w-seq
> [2] https://lore.kernel.org/all/282ef982-3e48-4283-9155-73a33fc1c4e8@linux.dev/
> 
> v7 -> v8: https://lore.kernel.org/all/20260914122950.3283997-1-usama.arif@linux.dev/
> - Cover letter: add the case-swap-w-seq performance results. (Andrew Morton)
> - Patches 2-8: reword the opening paragraph as "Prepare for ..." instead of
>   referring to a later patch. (David Hildenbrand)
> - Patch 4 (powerpc): move the PMD exclusive helpers next to the soft-dirty
>   PMD helpers and express them the same way, as pte_pmd()/pmd_pte()
>   wrappers over the PTE helpers. (David Hildenbrand)
> - Patch 6 (s390): drop the comment above the helpers, keep the explanation
>   in the RSTE swap layout above __SWP_OFFSET_MASK_RSTE, and move the
>   helpers into the existing CONFIG_ARCH_HAS_PMD_SOFTLEAVES block above
>   pmd_swp_soft_dirty(). (David Hildenbrand)
> - Patch 7 (x86): add static_assert(_PAGE_SWP_EXCLUSIVE != _PAGE_PSE) so a
>   32-bit build that ever selects ARCH_HAS_PMD_SOFTLEAVES fails to compile
>   rather than producing pmd_present() swap entries. (Kiryl Shutsemau)
> - Patch 10: rename the flag to to_migration_entries, use two-tab
>   continuation indentation, reword the split comment, turn the comment on
>   split_pmd_to_migration_entries() into kerneldoc, and fold the
>   try_to_migrate_one() call onto one line.  Also drop that helper's
>   pmd_trans_huge() || pmd_is_valid_softleaf() test, which was both too loose
>   and silently skipped the split, in favour of a VM_WARN_ON_ONCE() at the top
>   of __split_huge_pmd_locked() asserting that to_migration_entries implies a
>   present or device-private PMD. (David Hildenbrand)
> - Patch 11: drop the VM_WARN_ON_ONCE()/force and its comment from the swap
>   decode arm - 10/29 now asserts the to_migration_entries contract at the top
>   of __split_huge_pmd_locked() instead - and build the replacement PTEs by
>   advancing pte_next_swp_offset() rather than rebuilding each entry, which
>   hoists the soft-dirty/uffd/exclusive tests out of the loop. (David
>   Hildenbrand).
> - Patch 12 (new): split the swap-side changes out of the fork patch, so the
>   swap-entry range duplication gets its own patch for the swap maintainers.
>   Keeps the single-slot names as inline wrappers so existing callers are
>   untouched. (David Hildenbrand)
> - Patch 13 (fork): report a failed swap dup as -EIO and let copy_pmd_range()
>   own the GFP_KERNEL retry, as the PTE path does, dropping the open-coded
>   retry loop; move the mm counter update into each entry-type arm. (David
>   Hildenbrand)
> - Patch 16 (smaps): smaps_account_swap() takes nr_pages rather than a byte
>   size, and the local is called swapcount. (David Hildenbrand)
> - No other functional change.  All twelve sashiko findings on v7 were
>   analysed and none are defects of this series.
> 
> v6 -> v7: https://lore.kernel.org/all/20260818131202.494754-1-usama.arif@linux.dev/
> - Rebase onto akpm/mm-new at baa8de2f3448 and adapt to the new
>   get_swap_device() contract and linear_anon_page_index().  The series grows
>   from 12 to 29 patches.
> - Patch 1: code unchanged; reword the commit message and collect review tags.
> - Patches 2-9: split the six architecture helpers from generic detection and
>   add debug_vm_pgtable coverage.  Use the s390 RSTE exclusive bit, make the
>   x86 helper return bool, clear all PMD swap overlay bits before softleaf
>   decoding, and add the architecture maintainers to Cc.
> - Patches 10-11: add a preparatory no-functional-change cleanup of the
>   migration-splitting API and keep the PMD swap split separate.
> - Patch 12: reject a multi-slot duplication range that crosses a swap-cluster
>   boundary.
> - Patch 13: drop the zswap_load() change, now upstream as 1a904e0d3c43, and
>   check for zswap after swap-cache insertion while all slots are pinned.
> - Patch 14: scan every subpage for hardware poison, discard a failed or newly
>   allocated unmapped PMD-sized folio before PTE fallback, and recheck the PMD
>   before splitting it.
> - Patches 15-23: split the non-present PMD walkers by subsystem.  Add the
>   guard-advice patch so MADV_GUARD_INSTALL/REMOVE leaves PMD swap entries
>   whole; the other split patches preserve v6 behaviour.
> - Patch 24: honour the current THP policy, discard a failed PMD-sized folio,
>   and recheck the PMD before PTE fallback.
> - Patch 25: do not split after cached-folio revalidation loses a race; retry
>   so a restored present THP remains whole.
> - Patches 26-27: separate the independent PTE-batching hardware-poison fix,
>   scan subpages directly, and discard failed or never-mapped PMD-sized folios
>   before PTE retry instead of making the whole range fail with SIGBUS.
> - Patch 28: keep the normal swap-out path unchanged, but make failed producer
>   preconditions warn and return -EBUSY rather than BUG or return -EINVAL.
> - Patch 29: grow the selftests from 16 to 17, adding
>   swapin_sync/cache-residency coverage and more robust feature, fallback,
>   privilege, data-integrity, and swap-device-priority handling.
> 
> v5 -> v6: https://lore.kernel.org/all/20260722152043.2273289-1-usama.arif@linux.dev/
> - Add patch 1 to rename pmd_to_softleaf_folio() to
>   pmd_softleaf_to_folio().  No functional change. (Dev Jain)
> - Patch 2: warn when pmd_softleaf_to_folio() is given a non-PFN
>   softleaf rather than silently returning NULL. (Dev Jain)
> - Patch 4: bound the fork extend-table fallback to one retry, re-read
>   the PMD under its lock, normalize unrecoverable copy_huge_pmd() errors
>   to -ENOMEM so copy_pmd_range() cannot clear and leak the source swap
>   PMD, and drop a redundant thp_migration_supported() gate.
> - Patch 5: check multi-page swap-cache insertions for zswap-backed slots
>   in __swap_cache_add_check() under the cluster lock, both before
>   allocation and before insertion, and reject mixed zswap/disk state
>   with -EBUSY. (Yosry Ahmed, Nhat Pham)
> - Patch 6: on a failed non-uptodate PMD-order read, remove the large
>   folio from swap cache before splitting so order-0
>   fallback retries individual slots rather than poisoning the whole
>   2 MiB range; retain hardware-poisoned folios for per-subpage handling.
> - Patch 7: make HMM snapshot mode report a PMD swap entry as non-resident,
>   matching PTE swap entries, rather than HMM_PFN_ERROR.  Drop redundant
>   thp_migration_supported() gates and simplify non-present PMD handling.
> - Patch 8: factor PMD MADV_WILLNEED prefetch into
>   swapin_pmd_swap_entry(), split and retry through PTEs after any
>   PMD-order swapin failure, and replace the racy folio_test_locked()
>   plus folio_lock() sequence with folio_trylock().
> - Patch 9: guard PMD-swap UFFDIO_MOVE code with CONFIG_THP_SWAP, clarify
>   RWP marker propagation, and reject a PMD swap entry at the destination
>   with -EEXIST so UFFDIO_MOVE cannot loop forever on -EAGAIN.
> - Patch 10: honor current THP/VMA policy before PMD-order swap-in, recheck
>   that the PMD is still the original swap entry before splitting for PTE
>   fallback, and provide the CONFIG_TRANSPARENT_HUGEPAGE wp_huge_pmd()
>   declaration/stub needed by THP=n builds.
> - Patch 11: make an invalid set_pmd_swap_entry() walk context warn and
>   return -EINVAL instead of falsely reporting success and corrupting the
>   MM_ANONPAGES/MM_SWAPENTS accounting, and add an exact PMD-size folio
>   precondition check. (Luiz Capitulino)
> - Patch 12: use /proc/swaps for prerequisite detection, check
>   MADV_HUGEPAGE, and distinguish an environment that cannot allocate a
>   PMD THP (SKIP) from a swap-out validation failure (FAIL).  Add
>   partial-mprotect and partial-munmap split coverage.  Strengthen
>   munmap/MADV_FREE VmSwap accounting, pagemap slot-offset checks, and
>   mprotect/mremap swapped-state checks; force mremap to move, check
>   munmap()'s return, and mark the UFFDIO_MOVE destination MADV_HUGEPAGE
>   before asserting PMD restoration.  Move common setup and cleanup into
>   one fixture, merge the swapoff fixture, remove the redundant cycles
>   test, and make the data pattern differ between base pages so the split
>   tests can detect incorrect slot ordering.  Order fork-COW so the parent
>   writes while the child still holds the untouched shared swap entry.
>   (Luiz Capitulino)
> - Clarify commit messages throughout.  Retain TTU_SPLIT_HUGE_PMD after
>   prototyping its removal: removing it here requires an extra rmap walk
>   and broadens the series beyond PMD swap entries. (Matthew Wilcox)
> - Rebase onto akpm/mm-new from 15 August (4b65683fd25f).
> 
> v4 -> v5: https://lore.kernel.org/all/20260713133613.2707815-1-usama.arif@linux.dev/
> - Commit message improvements for almost all patches (Yosry for zswap patch)
> - Patch 1: make pmd_to_softleaf_folio() reject softleaf entries that do
>   not encode a PFN, so a PMD swap offset is never interpreted as one.
>   PMD swap entries remain valid softleaf entries for classification.
>   (sashiko)
> - Patch 2: use the existing pmd_swp_uffd() helper and force freeze=false
>   for PMD swap entries, which have no struct page for the migration-entry
>   freeze path. (sashiko)
> - Patch 3: document that the caller's page-table or swap-cache reference
>   pins every source slot while a partial PMD-sized duplication is rolled
>   back.  Keep the pre-existing PTE fork retry behavior outside this
>   series. (sashiko)
> - Patch 5: split to the PTE path rather than mapping a PMD-sized folio
>   containing a hardware-poisoned subpage, and restore PAGE_NONE when
>   swapoff restores a UFFD marker in an RWP VMA. (sashiko)
> - Patch 6: account SwapPss for a PMD swap entry one slot at a time because
>   the slots can have different swap reference counts.
> - Patch 7: if PMD-order MADV_WILLNEED encounters newly populated per-page
>   zswap state, revalidate and remove the failed clean PMD-sized cache
>   folio before retrying through PTEs.
> - Patch 8: mark a moved PMD swap entry for UFFD when the UFFDIO_MOVE
>   destination VMA is RWP-registered. (sashiko)
> - Patch 9: restore PAGE_NONE for UFFD RWP swap-in, preserve the original
>   write-fault state through swap-slot release and COW handling, remove
>   the unnecessary LRU drain, and prevent PTE batching from mapping a
>   poisoned subpage. (sashiko)
> - Patch 10: add and document thp_swpout_pmd, which counts PMD mappings
>   replaced by PMD-level swap entries rather than swapped folios.
> - Patch 11: register pmd_swap with the default mm selftest runner, preserve
>   errno across UFFDIO_MOVE cleanup, check swapoff residency before the
>   first memory access, add a parent-side write and verification to the
>   fork+COW test, and add RWP regression coverage for swap-in, UFFDIO_MOVE,
>   and swapoff. (sashiko)
> - Keep do_huge_pmd_swap_page() in patch 9.  Patches 6 and 7 only add
>   consumers; patch 10 remains the first producer, so no PMD swap entry
>   can reach those paths before the fault handler is present. (sashiko)
> - Rebase onto latest akpm/mm-new from 22 July (5e0603ba185a)
> 
> v3 -> v4: https://lore.kernel.org/all/20260703173903.3789516-1-usama.arif@linux.dev/
> - Patch 1: guard the new arch-specific pmd_swp_mkexclusive /
>   pmd_swp_exclusive / pmd_swp_clear_exclusive helpers on arm64,
>   loongarch, powerpc, riscv, s390, and x86 with
>   CONFIG_ARCH_HAS_PMD_SOFTLEAVES, matching the pattern already
>   used for pmd_swp_soft_dirty.  Also fixes the redefinition-vs-
>   generic-fallback build errors kernel test robot reported on
>   i386-allnoconfig-bpf and riscv-allnoconfig-bpf, and rewraps
>   the patch 1 commit message paragraphs to ~75 columns.
>   (sashiko, kernel test robot, Usama Arif)
> - Patch 2: switch the trailing folio_remove_rmap_pmd() gate in
>   __split_huge_pmd_locked() from *pmd to old_pmd, old_pmd retains
>   the original present-or-non-present classification for every
>   branch above. (sashiko)
> - Patch 3: teach swap_retry_table_alloc() (and the underlying
>   swap_extend_table_alloc()) to accept an nr parameter and scan
>   every slot in [ci_off, ci_off + nr) before committing an
>   extend-table allocation.  (sashiko)
> - Patch 4: rename zswap_range_has_entry() to zswap_is_present() so
>   the same helper serves both single-slot (nr=1) and range queries,
>   and switch the implementation from XA_STATE + xas_find() to
>   xa_find(), which handles RCU locking and internal-retry markers
>   itself.  Rename the callers in patches 5, 7, 9. (Yosry)
> - Patch 9: refuse to map a swap-cache folio in do_huge_pmd_swap_page()
>   when folio_contain_hwpoisoned_page() reports a poisoned subpage;
>   split the PMD swap entry so do_swap_page() can return
>   VM_FAULT_HWPOISON per subpage instead of the PMD handler mapping
>   the corrupted memory as one THP.  Mirrors the PageHWPoison check
>   the PTE swap-in path already performs. (sashiko)
> - Patch 9: note explicitly in the commit message that PMD-order
>   swap-in deliberately skips the order-0 readahead paths, order-0
>   readahead would populate per-page swap-cache state and force the
>   PMD swap entry to split before the fault could finish. (Kairui)
> - Patch 10: move mm_prepare_for_swap_entries() into
>   set_pmd_swap_entry() between folio_dup_swap() and set_pmd_at()
>   so this mm is on init_mm.mmlist before any swap PMD referencing
>   slots with a non-zero swap_map becomes visible.  Matches the PTE
>   swap-out ordering. (sashiko)
> - rebase onto latest akpm/mm-new (61cccb8363fcc282d4ae0555b8739dd227f5ad0b)
> 
> 
> v2 -> v3: https://lore.kernel.org/all/20260602142537.198755-1-usama.arif@linux.dev/
> - Clarified the PMD swap entry rule: it is a compact encoding for
>   HPAGE_PMD_NR swap slots, not a guarantee that swap cache always has
>   one PMD-sized folio. (Lance Yang)
> - Swapoff, fault, MADV_WILLNEED, and UFFDIO_MOVE now classify the
>   whole PMD swap-cache range and split/retry through the PTE path for
>   split/per-slot cache state. (Lance Yang)
> - mincore handles PMD swap entries without assuming one lookup covers
>   a split swap-cache range. (Lance Yang)
> - UFFDIO_MOVE rechecks all HPAGE_PMD_NR slots before moving an empty
>   PMD swap-cache range, avoiding stale rmap metadata for per-slot
>   cached folios.
> - Added a standalone zswap prerequisite patch from Alexandre that
>   distinguishes all-on-disk large-folio ranges from ranges with
>   per-page zswap entries.
> - Replaced the global zswap-ever-enabled policy with per-range zswap
>   checks: PMD swap entries can still be installed while zswap is
>   enabled, and PMD-order swap-in consumers split when the range has
>   per-page zswap state.
> - Added a mincore selftest and updated MADV_WILLNEED coverage so the
>   test checks that the PMD swap entry remains in place until first
>   touch.  Total pmd_swap coverage is now 14 tests.
> 
> 
> v1 -> v2: https://lore.kernel.org/all/20260427100553.2754667-1-usama.arif@linux.dev/
> - Patch 1: convert two additional softleaf_to_pmd() callers that
>   landed in mm-unstable since v1 (mm/debug_vm_pgtable.c,
>   mm/migrate_device.c) (Dev)
> - Patch 2: rename helper ensure_on_mmlist() to
>   mm_prepare_for_swap_entries() to better describe its purpose
>   (David)
> - Patch 3: drop VM_WARN_ON_ONCE(!pmd_is_migration_entry) as
>   Dev posted it as a separate patch.
> - Patch 5 (new): move softleaf_to_folio() inside the device-private
>   branch in migrate_vma_collect_pmd(); same class of fix as patch 4
>   but for the migrate-device PMD walker.
> - Patch 6 (new): rename CONFIG_ARCH_ENABLE_THP_MIGRATION to
>   CONFIG_ARCH_HAS_PMD_SOFTLEAVES so the gate that now drives
>   swap-entry support too is named for what it actually controls
>   (PMD softleaf entries), not just migration. (Dev)
> - Patch 7: add the missing pmd_swp_exclusive / mkexclusive /
>   clear_exclusive helpers for powerpc.
> - Patches 10 and 14: use upstream swapin_sync() (bundles
>   swap_cache_alloc_folio + swap_read_folio + the -EEXIST race
>   retry) instead of the bespoke swapin_alloc_pmd_folio() helper
>   from v1; do_swap_page and shmem_swapin_folio use the same
>   helper (Kairui)
> - Patch 10: construct a stack vm_fault for the swapoff swap-in so
>   the allocator can resolve a mempolicy, mirroring how the PTE
>   swapoff path (unuse_pte_range) already does it.
> - Patch 11: extend coverage to check_pmd_state() in khugepaged so a
>   swapped-out PMD-mapped THP is treated as SCAN_PMD_MAPPED (matches
>   the existing migration-entry handling). Route PMD swap entries in the
>   pmd_trans_huge_lock() branch of mincore_pte_range() through
>   mincore_pmd_swap() so a swapped-out PMD-mapped THP isn't reported as
>   resident.
> - Patch 12 (new): handle PMD swap entries in MADV_WILLNEED via
>   swapin_sync(BIT(HPAGE_PMD_ORDER)); a naive order-0 read-ahead
>   would force the subsequent fault to split.
> - Patch 13: refuse UFFDIO_MOVE with -EBUSY if the swap-cache folio
>   was split between swap-out and the move, matching
>   move_pages_pte()'s rejection of large folios; otherwise only one
>   of the 512 anon-rmaps would be re-anchored to dst_vma.
> - Patch 16: alloc_fill_swap_thp() now uses the existing
>   mmap_pmd_aligned() helper so tests don't flake/skip based on VA
>   placement; new MADV_WILLNEED test that watches the PMD-order
>   mTHP swpin counter; swapoff test restructured to use the
>   kselftest_harness ASSERT cleanup blocks (no double swapoff, no
>   verify-after-munmap).
> - Collected Acks and Reviews
> 
> Usama Arif (30):
>   mm: rename pmd_to_softleaf_folio() to pmd_softleaf_to_folio()
>   arm64: mm: add PMD swap-exclusive helpers
>   loongarch: mm: add PMD swap-exclusive helpers
>   powerpc: mm: add PMD swap-exclusive helpers
>   riscv: mm: add PMD swap-exclusive helpers
>   s390: mm: add PMD swap-exclusive helpers
>   x86: mm: add PMD swap-exclusive helpers
>   mm: recognize PMD swap entries in the softleaf layer
>   mm/debug_vm_pgtable: test PMD swap-exclusive helpers
>   mm: make PMD migration-entry splitting explicit
>   mm: split PMD swap entries into PTE swap entries
>   mm/swap: allow duplicating a range of swap entries
>   mm: handle PMD swap entries in fork path
>   mm: zswap: reject high-order swap cache allocations backed by zswap
>   mm: swap in PMD swap entries as whole THPs during swapoff
>   fs/proc: account PMD swap entries in smaps
>   mm: handle soft-dirty and uffd-wp on PMD swap entries
>   mm/hmm: fault PMD swap entries on demand
>   mm: free PMD swap entries in zap_huge_pmd()
>   mm/madvise: free PMD swap entries with MADV_FREE
>   mm/madvise: skip PMD swap entries for MADV_COLD and MADV_PAGEOUT
>   mm/madvise: keep PMD swap entries whole for MADV_GUARD_INSTALL/REMOVE
>   mm/mincore: report PMD swap-cache residency
>   mm/khugepaged: treat PMD swap entries as mapped THPs
>   mm: handle PMD swap entries in MADV_WILLNEED
>   mm: handle PMD swap entries in UFFDIO_MOVE
>   mm: don't PTE-batch a swap-in over a hardware-poisoned subpage
>   mm: handle PMD swap entry faults on swap-in
>   mm: install PMD swap entries on swap-out
>   selftests/mm: add PMD swap entry tests
> 
>  Documentation/admin-guide/mm/transhuge.rst   |   5 +
>  arch/arm64/include/asm/pgtable.h             |   6 +
>  arch/loongarch/include/asm/pgtable.h         |  19 +
>  arch/powerpc/include/asm/book3s/64/pgtable.h |   6 +
>  arch/riscv/include/asm/pgtable.h             |  15 +
>  arch/s390/include/asm/pgtable.h              |  20 +-
>  arch/x86/include/asm/pgtable.h               |  20 +
>  fs/proc/task_mmu.c                           |  45 +-
>  include/linux/huge_mm.h                      |  40 +-
>  include/linux/leafops.h                      |  44 +-
>  include/linux/pgtable.h                      |  17 +
>  include/linux/swap.h                         |  12 +-
>  include/linux/vm_event_item.h                |   1 +
>  include/linux/zswap.h                        |   6 +
>  mm/debug_vm_pgtable.c                        |  40 +
>  mm/hmm.c                                     |  11 +-
>  mm/huge_memory.c                             | 714 +++++++++++--
>  mm/internal.h                                |  58 ++
>  mm/khugepaged.c                              |   6 +
>  mm/madvise.c                                 | 169 +++-
>  mm/memory.c                                  |  65 +-
>  mm/migrate_device.c                          |   7 +-
>  mm/mincore.c                                 |  47 +-
>  mm/mprotect.c                                |   2 +-
>  mm/rmap.c                                    |  27 +-
>  mm/swap.h                                    |  30 +-
>  mm/swap_state.c                              |  83 +-
>  mm/swapfile.c                                | 245 ++++-
>  mm/userfaultfd.c                             |  14 +
>  mm/vmscan.c                                  |   9 +-
>  mm/vmstat.c                                  |   1 +
>  mm/zswap.c                                   |  12 +-
>  tools/testing/selftests/mm/Makefile          |   2 +
>  tools/testing/selftests/mm/ksft_pmd_swap.sh  |   4 +
>  tools/testing/selftests/mm/pmd_swap.c        | 989 +++++++++++++++++++
>  tools/testing/selftests/mm/run_vmtests.sh    |   4 +
>  tools/testing/selftests/mm/vm_util.c         |  24 +
>  tools/testing/selftests/mm/vm_util.h         |   2 +
>  38 files changed, 2630 insertions(+), 191 deletions(-)
>  create mode 100755 tools/testing/selftests/mm/ksft_pmd_swap.sh
>  create mode 100644 tools/testing/selftests/mm/pmd_swap.c
> 

I was hoping that we could get this into the next merge window, but as we are
approach rc6 and I didn't even manage to review all patches (shame on me), I
assume this would be a quite fit.

So I assume this series is one of the things that we'll try to get in shape over
the next merge window to queue it early after rc1.

-- 
Cheers,

David

  parent reply	other threads:[~2026-10-02 14:28 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-02  9:52 Usama Arif
2026-10-02  9:52 ` [PATCH v8 01/30] mm: rename pmd_to_softleaf_folio() to pmd_softleaf_to_folio() Usama Arif
2026-10-02  9:52 ` [PATCH v8 02/30] arm64: mm: add PMD swap-exclusive helpers Usama Arif
2026-10-02  9:52 ` [PATCH v8 03/30] loongarch: " Usama Arif
2026-10-02 14:17   ` Huacai Chen
2026-10-02  9:52 ` [PATCH v8 04/30] powerpc: " Usama Arif
2026-10-02  9:52 ` [PATCH v8 05/30] riscv: " Usama Arif
2026-10-02  9:52 ` [PATCH v8 06/30] s390: " Usama Arif
2026-10-02  9:52 ` [PATCH v8 07/30] x86: " Usama Arif
2026-10-02  9:52 ` [PATCH v8 08/30] mm: recognize PMD swap entries in the softleaf layer Usama Arif
2026-10-02  9:52 ` [PATCH v8 09/30] mm/debug_vm_pgtable: test PMD swap-exclusive helpers Usama Arif
2026-10-02  9:52 ` [PATCH v8 10/30] mm: make PMD migration-entry splitting explicit Usama Arif
2026-10-02  9:52 ` [PATCH v8 11/30] mm: split PMD swap entries into PTE swap entries Usama Arif
2026-10-02  9:52 ` [PATCH v8 12/30] mm/swap: allow duplicating a range of " Usama Arif
2026-10-02  9:52 ` [PATCH v8 13/30] mm: handle PMD swap entries in fork path Usama Arif
2026-10-02  9:52 ` [PATCH v8 14/30] mm: zswap: reject high-order swap cache allocations backed by zswap Usama Arif
2026-10-02  9:52 ` [PATCH v8 15/30] mm: swap in PMD swap entries as whole THPs during swapoff Usama Arif
2026-10-02  9:52 ` [PATCH v8 16/30] fs/proc: account PMD swap entries in smaps Usama Arif
2026-10-02  9:52 ` [PATCH v8 17/30] mm: handle soft-dirty and uffd-wp on PMD swap entries Usama Arif
2026-10-02  9:52 ` [PATCH v8 18/30] mm/hmm: fault PMD swap entries on demand Usama Arif
2026-10-02  9:52 ` [PATCH v8 19/30] mm: free PMD swap entries in zap_huge_pmd() Usama Arif
2026-10-02  9:52 ` [PATCH v8 20/30] mm/madvise: free PMD swap entries with MADV_FREE Usama Arif
2026-10-02  9:52 ` [PATCH v8 21/30] mm/madvise: skip PMD swap entries for MADV_COLD and MADV_PAGEOUT Usama Arif
2026-10-02  9:52 ` [PATCH v8 22/30] mm/madvise: keep PMD swap entries whole for MADV_GUARD_INSTALL/REMOVE Usama Arif
2026-10-02  9:52 ` [PATCH v8 23/30] mm/mincore: report PMD swap-cache residency Usama Arif
2026-10-02  9:52 ` [PATCH v8 24/30] mm/khugepaged: treat PMD swap entries as mapped THPs Usama Arif
2026-10-02  9:52 ` [PATCH v8 25/30] mm: handle PMD swap entries in MADV_WILLNEED Usama Arif
2026-10-02  9:52 ` [PATCH v8 26/30] mm: handle PMD swap entries in UFFDIO_MOVE Usama Arif
2026-10-02  9:52 ` [PATCH v8 27/30] mm: don't PTE-batch a swap-in over a hardware-poisoned subpage Usama Arif
2026-10-02  9:52 ` [PATCH v8 28/30] mm: handle PMD swap entry faults on swap-in Usama Arif
2026-10-02  9:52 ` [PATCH v8 29/30] mm: install PMD swap entries on swap-out Usama Arif
2026-10-02  9:52 ` [PATCH v8 30/30] selftests/mm: add PMD swap entry tests Usama Arif
2026-10-02 14:28 ` David Hildenbrand (Arm) [this message]
2026-10-02 15:13   ` [PATCH v8 00/30] mm: PMD-level swap entries for anonymous THPs Zi Yan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ebc72eb7-daf3-45be-8994-b51e5e301b56@kernel.org \
    --to=david@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=alex@ghiti.fr \
    --cc=baohua@kernel.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=baoquan.he@linux.dev \
    --cc=chrisl@kernel.org \
    --cc=dev.jain@arm.com \
    --cc=hannes@cmpxchg.org \
    --cc=kas@kernel.org \
    --cc=kasong@tencent.com \
    --cc=kernel-team@meta.com \
    --cc=lance.yang@linux.dev \
    --cc=liam@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ljs@kernel.org \
    --cc=luizcap@redhat.com \
    --cc=nico.pache@linux.dev \
    --cc=nphamcs@gmail.com \
    --cc=qi.zheng@linux.dev \
    --cc=riel@surriel.com \
    --cc=ryan.roberts@arm.com \
    --cc=shakeel.butt@linux.dev \
    --cc=shikemeng@huaweicloud.com \
    --cc=usama.arif@linux.dev \
    --cc=vbabka@kernel.org \
    --cc=willy@infradead.org \
    --cc=ying.huang@linux.alibaba.com \
    --cc=yosry@kernel.org \
    --cc=youngjun.park@lge.com \
    --cc=ziy@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®