From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>,
Janosch Frank <frankja@linux.ibm.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>,
David Hildenbrand <david@redhat.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
Gerald Schaefer <gerald.schaefer@linux.ibm.com>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Sven Schnelle <svens@linux.ibm.com>, Zi Yan <ziy@nvidia.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
"Liam R . Howlett" <Liam.Howlett@oracle.com>,
Nico Pache <npache@redhat.com>,
Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
Barry Song <baohua@kernel.org>, Lance Yang <lance.yang@linux.dev>,
Kemeng Shi <shikemeng@huaweicloud.com>,
Kairui Song <kasong@tencent.com>, Nhat Pham <nphamcs@gmail.com>,
Baoquan He <bhe@redhat.com>, Chris Li <chrisl@kernel.org>,
Peter Xu <peterx@redhat.com>,
Matthew Wilcox <willy@infradead.org>,
Jason Gunthorpe <jgg@ziepe.ca>, Leon Romanovsky <leon@kernel.org>,
Muchun Song <muchun.song@linux.dev>,
Oscar Salvador <osalvador@suse.de>,
Vlastimil Babka <vbabka@suse.cz>, Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>, Jann Horn <jannh@google.com>,
Matthew Brost <matthew.brost@intel.com>,
Joshua Hahn <joshua.hahnjy@gmail.com>,
Rakie Kim <rakie.kim@sk.com>, Byungchul Park <byungchul@sk.com>,
Gregory Price <gourry@gourry.net>,
Ying Huang <ying.huang@linux.alibaba.com>,
Alistair Popple <apopple@nvidia.com>,
Pedro Falcato <pfalcato@suse.de>,
Pasha Tatashin <pasha.tatashin@soleen.com>,
Rik van Riel <riel@surriel.com>, Harry Yoo <harry.yoo@oracle.com>,
kvm@vger.kernel.org, linux-s390@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org
Subject: [RFC PATCH 01/12] mm: introduce and use pte_to_swp_entry_or_zero()
Date: Fri, 24 Oct 2025 08:41:17 +0100 [thread overview]
Message-ID: <ebfe7ddeb8a165b757ad08c346b388c3dc7d6140.1761288179.git.lorenzo.stoakes@oracle.com> (raw)
In-Reply-To: <cover.1761288179.git.lorenzo.stoakes@oracle.com>
When we check data in swap entries in the form of a predicate it is usually
the case that if the swap entry were zero, the predicate would evaluate as
false.
We can therefore simplify predicate checks where we first check to see if
the entry is indeed a swap entry before doing so by instead using a new
function which returns the zero swap entry (that is, swp_entry(0, 0))
should the entry be present.
The pte_none() case is also covered by this, as it will naturally evaluate
to swp_entry(0, 0).
We implement this via pte_to_swp_entry_or_zero(), which we then use in
is_pte_marker() and pte_marker_uffd_wp() both of which otherwise
unnecessarily utilise is_swap_pte().
We additionally update smaps_hugetlb_range() following the same pattern.
Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
---
fs/proc/task_mmu.c | 4 ++--
include/linux/swapops.h | 20 +++++++++++++++++++-
include/linux/userfaultfd_k.h | 7 +------
mm/madvise.c | 5 +++--
mm/page_vma_mapped.c | 5 +----
5 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index fc35a0543f01..a7c8501266f4 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -1230,8 +1230,8 @@ static int smaps_hugetlb_range(pte_t *pte, unsigned long hmask,
if (pte_present(ptent)) {
folio = page_folio(pte_page(ptent));
present = true;
- } else if (is_swap_pte(ptent)) {
- swp_entry_t swpent = pte_to_swp_entry(ptent);
+ } else {
+ swp_entry_t swpent = pte_to_swp_entry_or_zero(ptent);
if (is_pfn_swap_entry(swpent))
folio = pfn_swap_entry_folio(swpent);
diff --git a/include/linux/swapops.h b/include/linux/swapops.h
index 2687928a8146..24eaf8825c6b 100644
--- a/include/linux/swapops.h
+++ b/include/linux/swapops.h
@@ -139,6 +139,24 @@ static inline swp_entry_t pte_to_swp_entry(pte_t pte)
return swp_entry(__swp_type(arch_entry), __swp_offset(arch_entry));
}
+/**
+ * pte_to_swp_entry_or_zero() - Convert an arbitrary PTE entry to either its
+ * swap entry, or the zero swap entry if the PTE is either present or empty
+ * (none).
+ * @pte: The PTE entry we are evaluating.
+ *
+ * Returns: A valid swap entry or the zero swap entry if the PTE is present or
+ * none.
+ */
+static inline swp_entry_t pte_to_swp_entry_or_zero(pte_t pte)
+{
+ if (pte_present(pte))
+ return swp_entry(0, 0);
+
+ /* If none, this will return zero entry. */
+ return pte_to_swp_entry(pte);
+}
+
/*
* Convert the arch-independent representation of a swp_entry_t into the
* arch-dependent pte representation.
@@ -438,7 +456,7 @@ static inline pte_marker pte_marker_get(swp_entry_t entry)
static inline bool is_pte_marker(pte_t pte)
{
- return is_swap_pte(pte) && is_pte_marker_entry(pte_to_swp_entry(pte));
+ return is_pte_marker_entry(pte_to_swp_entry_or_zero(pte));
}
static inline pte_t make_pte_marker(pte_marker marker)
diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h
index c0e716aec26a..4c65adff2e7a 100644
--- a/include/linux/userfaultfd_k.h
+++ b/include/linux/userfaultfd_k.h
@@ -447,12 +447,7 @@ static inline bool pte_marker_entry_uffd_wp(swp_entry_t entry)
static inline bool pte_marker_uffd_wp(pte_t pte)
{
#ifdef CONFIG_PTE_MARKER_UFFD_WP
- swp_entry_t entry;
-
- if (!is_swap_pte(pte))
- return false;
-
- entry = pte_to_swp_entry(pte);
+ swp_entry_t entry = pte_to_swp_entry_or_zero(pte);
return pte_marker_entry_uffd_wp(entry);
#else
diff --git a/mm/madvise.c b/mm/madvise.c
index fb1c86e630b6..f9f80b2e9d43 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -1071,8 +1071,9 @@ static bool is_valid_guard_vma(struct vm_area_struct *vma, bool allow_locked)
static bool is_guard_pte_marker(pte_t ptent)
{
- return is_swap_pte(ptent) &&
- is_guard_swp_entry(pte_to_swp_entry(ptent));
+ const swp_entry_t entry = pte_to_swp_entry_or_zero(ptent);
+
+ return is_guard_swp_entry(entry);
}
static int guard_install_pud_entry(pud_t *pud, unsigned long addr,
diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 137ce27ff68c..75a8fbb788b7 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -107,10 +107,7 @@ static bool check_pte(struct page_vma_mapped_walk *pvmw, unsigned long pte_nr)
pte_t ptent = ptep_get(pvmw->pte);
if (pvmw->flags & PVMW_MIGRATION) {
- swp_entry_t entry;
- if (!is_swap_pte(ptent))
- return false;
- entry = pte_to_swp_entry(ptent);
+ swp_entry_t entry = pte_to_swp_entry_or_zero(ptent);
if (!is_migration_entry(entry))
return false;
--
2.51.0
next prev parent reply other threads:[~2025-10-24 7:42 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-24 7:41 [RFC PATCH 00/12] remove is_swap_[pte, pmd]() + non-swap confusion Lorenzo Stoakes
2025-10-24 7:41 ` Lorenzo Stoakes [this message]
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
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=ebfe7ddeb8a165b757ad08c346b388c3dc7d6140.1761288179.git.lorenzo.stoakes@oracle.com \
--to=lorenzo.stoakes@oracle.com \
--cc=Liam.Howlett@oracle.com \
--cc=agordeev@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=apopple@nvidia.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=bhe@redhat.com \
--cc=borntraeger@linux.ibm.com \
--cc=byungchul@sk.com \
--cc=chrisl@kernel.org \
--cc=david@redhat.com \
--cc=dev.jain@arm.com \
--cc=frankja@linux.ibm.com \
--cc=gerald.schaefer@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=gourry@gourry.net \
--cc=harry.yoo@oracle.com \
--cc=hca@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=jannh@google.com \
--cc=jgg@ziepe.ca \
--cc=joshua.hahnjy@gmail.com \
--cc=kasong@tencent.com \
--cc=kvm@vger.kernel.org \
--cc=lance.yang@linux.dev \
--cc=leon@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-s390@vger.kernel.org \
--cc=matthew.brost@intel.com \
--cc=mhocko@suse.com \
--cc=muchun.song@linux.dev \
--cc=npache@redhat.com \
--cc=nphamcs@gmail.com \
--cc=osalvador@suse.de \
--cc=pasha.tatashin@soleen.com \
--cc=peterx@redhat.com \
--cc=pfalcato@suse.de \
--cc=rakie.kim@sk.com \
--cc=riel@surriel.com \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shikemeng@huaweicloud.com \
--cc=surenb@google.com \
--cc=svens@linux.ibm.com \
--cc=vbabka@suse.cz \
--cc=willy@infradead.org \
--cc=ying.huang@linux.alibaba.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