Skip to content

support large folio swap-out and swap-in for shmem

Baolin Wang linux-mm lkml 5 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v5 Latest9 patches 12 repliesIn review 5 of 9 applied
  2. v410 patches 10 repliesSuperseded
  3. v310 patches 0 repliesSuperseded
Earlier versions · 2
VersionPostedPatchesRepliesStatus
v29 patches14 repliesSuperseded
v17 patches8 repliesSuperseded

Changes in v5 from the cover letter

- Add reviewed tag from Barry. Thanks.
- Drop patch 1 and move shmem split to shmem_writepage(), which can avoid other unnecessary split, per David.

Patches in v5 5 of 9 applied

#Subject and filesSizeRepliesApplied
1/9mm: swap: extend swap_shmem_alloc() to support batch SWAP_MAP_SHMEM flag settinginclude/linux/swap.h mm/shmem.c mm/swapfile.c+8 -60 repliesApplied
2/9mm: shmem: extend shmem_partial_swap_usage() to support large folio swapmm/shmem.c+1 -10 repliesApplied
3/9mm: shmem: return number of pages beeing freed in shmem_free_swapmm/shmem.c+16 -90 repliesApplied
4/9mm: filemap: use xa_get_order() to get the swap entry ordermm/filemap.c+4 -06 replies
5/9mm: shmem: use swap_free_nr() to free shmem swap entriesmm/shmem.c+10 -60 repliesApplied
6/9mm: shmem: support large folio allocation for shmem_replace_folio()mm/shmem.c+31 -232 replies
7/9mm: shmem: drop folio reference count using 'nr_pages' in shmem_delete_from_page_cache()mm/shmem.c+1 -10 repliesApplied
8/9mm: shmem: split large entry if the swapin folio is not largemm/shmem.c+100 -02 replies
9/9mm: shmem: support large folio swap outdrivers/gpu/drm/i915/gem/i915_gem_shmem.c include/linux/writeback.h mm/shmem.c +1 more+38 -113 replies

Reviews trailers per patch

1 of 9 patches has a Reviewed-by or Acked-by.

PatchBarry Song
1/9R-b
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v5 thread

Cover letter [PATCH v5 0/9] support large folio swap-out and swap-in for shmem

Shmem will support large folio allocation [1] [2] to get a better performance, however, the memory reclaim still splits the precious large folios when trying to swap-out shmem, which may lead to the memory fragmentation issue and can not take advantage of the large folio for shmeme.

Moreover, the swap code already supports for swapping out large folio without split, and large folio swap-in[3] series is queued into mm-unstable branch. Hence this patch set also supports the large folio swap-out and swap-in for shmem.

Please help to review. Thanks.

Functional testing
==================
Machine environment: 32 Arm cores, 120G memory and 50G swap device.

1. Run xfstests suite to test tmpfs filesystem, and I did not catch any regressions with this patch set.
FSTYP=tmpfs
export TEST_DIR=/mnt/tempfs_mnt
export TEST_DEV=/mnt/tempfs_mnt
export SCRATCH_MNT=/mnt/scratchdir
export SCRATCH_DEV=/mnt/scratchdir

2. Run all mm selftests in tools/testing/selftests/mm/, and no regressions found.

3. I also wrote several shmem swap test cases, including shmem splitting, shmem swapout, shmem swapin, swapoff during shmem swapout, shmem reclaim, shmem swapin replacement, etc. I tested these cases under 4K and 64K shmem folio sizes with a swap device, and shmem swap functionality works well on my machine.

[1] https://lore.kernel.org/all/[email protected]/
[2] https://lore.kernel.org/all/[email protected]/
[3] https://lore.kernel.org/all/[email protected]/T/
[4] https://lore.kernel.org/all/[email protected]/

Changes from v4:
- Add reviewed tag from Barry. Thanks.
- Drop patch 1 and move shmem split to shmem_writepage(), which can avoid other unnecessary split, per David.

Changes from v3:
- Rebase to the latest mm-unstable.
- Simplify patch 2 based on Barry's patch:
https://lkml.kernel.org/r/[email protected]

Chagens from v2:
- Add new patch to split large swap entry if swapin folio is order 0 folio.
- Update some commit message.

Changes from v1:
- Remove useless 'order' variable in shmem_partial_swap_usage(), per Daniel.
- Add a new patch to return number of pages beeing freed in shmem_free_swap(), per Daniel.
- Drop 'orders' parameter for find_get_entries() and find_lock_entries().
- Round down the index when adding the swapin folio into the pagecache, suggested by Hugh.
- Fix the reference issue when removing folio from pagecache in patch 8.
- Fix replacing old folio in swap cache in patch 7.

Changes from RFC:
- Rebased to the latest mm-unstable.
- Drop the counter name fixing patch, which was queued into mm-hotfixes-stable branch.

Baolin Wang (8):
mm: swap: extend swap_shmem_alloc() to support batch SWAP_MAP_SHMEM
flag setting
mm: shmem: extend shmem_partial_swap_usage() to support large folio
swap
mm: filemap: use xa_get_order() to get the swap entry order
mm: shmem: use swap_free_nr() to free shmem swap entries
mm: shmem: support large folio allocation for shmem_replace_folio()
mm: shmem: drop folio reference count using 'nr_pages' in
shmem_delete_from_page_cache()
mm: shmem: split large entry if the swapin folio is not large
mm: shmem: support large folio swap out

Daniel Gomez (1):
mm: shmem: return number of pages beeing freed in shmem_free_swap

 drivers/gpu/drm/i915/gem/i915_gem_shmem.c |   1 +
 include/linux/swap.h                      |   4 +-
 include/linux/writeback.h                 |   4 +
 mm/filemap.c                              |   4 +
 mm/shmem.c                                | 217 +++++++++++++++++-----
 mm/swapfile.c                             |   4 +-
 mm/vmscan.c                               |  32 +++-
 7 files changed, 209 insertions(+), 57 deletions(-)
Signature · 1 line
2.39.3