linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH 00/12] remove is_swap_[pte, pmd]() + non-swap confusion
@ 2025-10-24  7:41 Lorenzo Stoakes
  2025-10-24  7:41 ` [RFC PATCH 01/12] mm: introduce and use pte_to_swp_entry_or_zero() Lorenzo Stoakes
                   ` (13 more replies)
  0 siblings, 14 replies; 47+ messages in thread
From: Lorenzo Stoakes @ 2025-10-24  7:41 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Christian Borntraeger, Janosch Frank, Claudio Imbrenda,
	David Hildenbrand, Alexander Gordeev, Gerald Schaefer,
	Heiko Carstens, Vasily Gorbik, Sven Schnelle, Zi Yan,
	Baolin Wang, Liam R . Howlett, Nico Pache, Ryan Roberts,
	Dev Jain, Barry Song, Lance Yang, Kemeng Shi, Kairui Song,
	Nhat Pham, Baoquan He, Chris Li, Peter Xu, Matthew Wilcox,
	Jason Gunthorpe, Leon Romanovsky, Muchun Song, Oscar Salvador,
	Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
	Jann Horn, Matthew Brost, Joshua Hahn, Rakie Kim, Byungchul Park,
	Gregory Price, Ying Huang, Alistair Popple, Pedro Falcato,
	Pasha Tatashin, Rik van Riel, Harry Yoo, kvm, linux-s390,
	linux-kernel, linux-fsdevel, linux-mm

There's an established convention in the kernel that we treat leaf page
tables (so far at the PTE, PMD level) as containing 'swap entries' should
they be neither empty (i.e. p**_none() evaluating true) nor present
(i.e. p**_present() evaluating true).

However, at the same time we also have helper predicates - is_swap_pte(),
is_swap_pmd() - which are inconsistently used.

This is problematic, as it is logical to assume that should somebody wish
to operate upon a page table swap entry they should first check to see if
it is in fact one.

It also implies that perhaps, in future, we might introduce a non-present,
none page table entry that is not a swap entry.

This series resolves this issue by systematically eliminating all use of
the is_swap_pte() and is swap_pmd() predicates so we retain only the
convention that should a leaf page table entry be neither none nor present
it is a swap entry.

We also have the further issue that 'swap entry' is unfortunately a really
rather overloaded term and in fact refers to both entries for swap and for
other information such as migration entries, page table markers, and device
private entries.

We therefore have the rather 'unique' concept of a 'non-swap' swap entry.

This is deeply confusing, so this series goes further and eliminates the
non_swap_entry() predicate, replacing it with is_non_present_entry() - with
an eye to a new convention of referring to these non-swap 'swap entries' as
non-present.

It also introduces the is_swap_entry() predicate to explicitly and
logically refer to actual 'true' swap entries, improving code readibility,
avoiding the hideous convention of:

	if (!non_swap_entry(entry)) {
		...
	}

As part of these changes we also introduce a few other new predicates:

* pte_to_swp_entry_or_zero() - allows for convenient conversion from a PTE
  to a swap entry if present, or an empty swap entry if none. This is
  useful as many swap entry conversions are simply checking for flags for
  which this suffices.

* get_pte_swap_entry() - Retrieves a PTE swap entry if it truly is a swap
  entry (i.e. not a non-present entry), returning true if so, otherwise
  returns false. This simplifies a lot of logic that previously open-coded
  this.

* is_huge_pmd() - Determines if a PMD contains either a present transparent
  huge page entry or a huge non-present entry. This again simplifies a lot
  of logic that simply open-coded this.

REVIEWERS NOTE:

This series applies against mm-unstable as there are currently conflicts
with mm-new. Should the series receive community assent I will resolve
these at the point the RFC tag is removed.

I also intend to use this as a foundation for further work to add higher
order page table markers.

Lorenzo Stoakes (12):
  mm: introduce and use pte_to_swp_entry_or_zero()
  mm: avoid unnecessary uses of is_swap_pte()
  mm: introduce get_pte_swap_entry() and use it
  mm: use get_pte_swap_entry() in debug pgtable + remove is_swap_pte()
  fs/proc/task_mmu: refactor pagemap_pmd_range()
  mm: avoid unnecessary use of is_swap_pmd()
  mm: introduce is_huge_pmd() and use where appropriate
  mm/huge_memory: refactor copy_huge_pmd() non-present logic
  mm/huge_memory: refactor change_huge_pmd() non-present logic
  mm: remove remaining is_swap_pmd() users and is_swap_pmd()
  mm: rename non_swap_entry() to is_non_present_entry()
  mm: provide is_swap_entry() and use it

 arch/s390/mm/gmap_helpers.c   |   2 +-
 arch/s390/mm/pgtable.c        |   2 +-
 fs/proc/task_mmu.c            | 214 ++++++++++++++++++++--------------
 include/linux/huge_mm.h       |  49 +++++---
 include/linux/swapops.h       |  99 ++++++++++++++--
 include/linux/userfaultfd_k.h |  16 +--
 mm/debug_vm_pgtable.c         |  43 ++++---
 mm/filemap.c                  |   2 +-
 mm/hmm.c                      |   2 +-
 mm/huge_memory.c              | 189 ++++++++++++++++--------------
 mm/hugetlb.c                  |   6 +-
 mm/internal.h                 |  12 +-
 mm/khugepaged.c               |  29 ++---
 mm/madvise.c                  |  14 +--
 mm/memory.c                   |  62 +++++-----
 mm/migrate.c                  |   2 +-
 mm/mincore.c                  |   2 +-
 mm/mprotect.c                 |  45 ++++---
 mm/mremap.c                   |   9 +-
 mm/page_table_check.c         |  25 ++--
 mm/page_vma_mapped.c          |  30 +++--
 mm/swap_state.c               |   5 +-
 mm/swapfile.c                 |   3 +-
 mm/userfaultfd.c              |   2 +-
 24 files changed, 511 insertions(+), 353 deletions(-)

--
2.51.0


^ permalink raw reply	[flat|nested] 47+ messages in thread

end of thread, other threads:[~2025-11-02 14:27 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-24  7:41 [RFC PATCH 00/12] remove is_swap_[pte, pmd]() + non-swap confusion Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 01/12] mm: introduce and use pte_to_swp_entry_or_zero() Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 02/12] mm: avoid unnecessary uses of is_swap_pte() Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 03/12] mm: introduce get_pte_swap_entry() and use it Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 04/12] mm: use get_pte_swap_entry() in debug pgtable + remove is_swap_pte() Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 05/12] fs/proc/task_mmu: refactor pagemap_pmd_range() Lorenzo Stoakes
2025-10-24 17:32   ` Gregory Price
2025-10-24 18:19     ` Lorenzo Stoakes
2025-10-24 19:12       ` Gregory Price
2025-10-24 20:15         ` Lorenzo Stoakes
2025-10-24 20:37           ` Gregory Price
2025-10-27 15:26             ` Lorenzo Stoakes
2025-10-27 16:11             ` Jason Gunthorpe
2025-10-27 16:15               ` David Hildenbrand
2025-10-27 16:26               ` Lorenzo Stoakes
2025-10-27 16:31                 ` David Hildenbrand
2025-10-27 16:38                   ` Lorenzo Stoakes
2025-10-27 17:08                     ` Alexander Gordeev
2025-10-28 12:52                     ` Jason Gunthorpe
2025-10-28 13:09                       ` Gregory Price
2025-10-28 17:36                         ` Lorenzo Stoakes
2025-10-28 18:23                       ` Lorenzo Stoakes
2025-10-27 16:38                 ` Gregory Price
2025-10-24  7:41 ` [RFC PATCH 06/12] mm: avoid unnecessary use of is_swap_pmd() Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 07/12] mm: introduce is_huge_pmd() and use where appropriate Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 08/12] mm/huge_memory: refactor copy_huge_pmd() non-present logic Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 09/12] mm/huge_memory: refactor change_huge_pmd() " Lorenzo Stoakes
2025-10-24 18:41   ` Gregory Price
2025-10-24 18:44     ` Lorenzo Stoakes
2025-10-24 19:09       ` Gregory Price
2025-10-24  7:41 ` [RFC PATCH 10/12] mm: remove remaining is_swap_pmd() users and is_swap_pmd() Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 11/12] mm: rename non_swap_entry() to is_non_present_entry() Lorenzo Stoakes
2025-10-24 19:07   ` Gregory Price
2025-10-24 20:17     ` Lorenzo Stoakes
2025-10-24  7:41 ` [RFC PATCH 12/12] mm: provide is_swap_entry() and use it Lorenzo Stoakes
2025-10-24 20:05 ` [RFC PATCH 00/12] remove is_swap_[pte, pmd]() + non-swap confusion Yosry Ahmed
2025-10-24 20:14   ` Lorenzo Stoakes
2025-10-27 16:09 ` Jason Gunthorpe
2025-10-27 17:33   ` Lorenzo Stoakes
2025-10-28 12:48     ` Jason Gunthorpe
2025-10-28 18:20       ` Lorenzo Stoakes
2025-10-29 14:10         ` Jason Gunthorpe
2025-10-29 19:09           ` Lorenzo Stoakes
2025-10-29 21:23             ` Gregory Price
2025-10-30 10:21               ` Lorenzo Stoakes
2025-11-02 14:27               ` Lorenzo Stoakes
2025-10-27 23:32   ` Gregory Price

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox