From: Nhat Pham <nphamcs@gmail.com>
To: kasong@tencent.com
Cc: Liam.Howlett@oracle.com, akpm@linux-foundation.org,
apopple@nvidia.com, axelrasmussen@google.com, baohua@kernel.org,
baolin.wang@linux.alibaba.com, bhe@redhat.com, byungchul@sk.com,
cgroups@vger.kernel.org, chengming.zhou@linux.dev,
chrisl@kernel.org, corbet@lwn.net, david@kernel.org,
dev.jain@arm.com, gourry@gourry.net, hannes@cmpxchg.org,
hughd@google.com, jannh@google.com, joshua.hahnjy@gmail.com,
lance.yang@linux.dev, lenb@kernel.org, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
linux-pm@vger.kernel.org, lorenzo.stoakes@oracle.com,
matthew.brost@intel.com, mhocko@suse.com, muchun.song@linux.dev,
npache@redhat.com, nphamcs@gmail.com, pavel@kernel.org,
peterx@redhat.com, peterz@infradead.org, pfalcato@suse.de,
rafael@kernel.org, rakie.kim@sk.com, roman.gushchin@linux.dev,
rppt@kernel.org, ryan.roberts@arm.com, shakeel.butt@linux.dev,
shikemeng@huaweicloud.com, surenb@google.com, tglx@kernel.org,
vbabka@suse.cz, weixugc@google.com, ying.huang@linux.alibaba.com,
yosry.ahmed@linux.dev, yuanchu@google.com,
zhengqi.arch@bytedance.com, ziy@nvidia.com, kernel-team@meta.com,
riel@surriel.com
Subject: [PATCH v4 05/21] mm/swap: add a new function to check if a swap entry is in swap cached.
Date: Wed, 18 Mar 2026 15:29:36 -0700 [thread overview]
Message-ID: <20260318222953.441758-6-nphamcs@gmail.com> (raw)
In-Reply-To: <20260318222953.441758-1-nphamcs@gmail.com>
Userfaultfd checks whether a swap entry is in swapcache. This is
currently done by directly looking at the swapfile's swap map - however,
the swap cached state will soon be managed at the virtual swap layer.
Abstract away this function.
Signed-off-by: Nhat Pham <nphamcs@gmail.com>
---
include/linux/swap.h | 6 ++++++
mm/swapfile.c | 15 +++++++++++++++
mm/userfaultfd.c | 3 +--
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/include/linux/swap.h b/include/linux/swap.h
index 3da637b218baf..f91a442ac0e82 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -435,6 +435,7 @@ void free_swap_and_cache_nr(swp_entry_t entry, int nr);
int __swap_count(swp_entry_t entry);
bool swap_entry_swapped(struct swap_info_struct *si, swp_entry_t entry);
int swp_swapcount(swp_entry_t entry);
+bool is_swap_cached(swp_entry_t entry);
/* Swap cache API (mm/swap_state.c) */
static inline unsigned long total_swapcache_pages(void)
@@ -554,6 +555,11 @@ static inline int swp_swapcount(swp_entry_t entry)
return 0;
}
+static inline bool is_swap_cached(swp_entry_t entry)
+{
+ return false;
+}
+
static inline int folio_alloc_swap(struct folio *folio)
{
return -EINVAL;
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 46da28c533bbe..0471a965f222b 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -194,6 +194,21 @@ static bool swap_only_has_cache(struct swap_info_struct *si,
return true;
}
+/**
+ * is_swap_cached - check if the swap entry is cached
+ * @entry: swap entry to check
+ *
+ * Check swap_map directly to minimize overhead, READ_ONCE is sufficient.
+ *
+ * Returns true if the swap entry is cached, false otherwise.
+ */
+bool is_swap_cached(swp_entry_t entry)
+{
+ struct swap_info_struct *si = __swap_entry_to_info(entry);
+
+ return READ_ONCE(si->swap_map[swp_offset(entry)]) & SWAP_HAS_CACHE;
+}
+
static bool swap_is_last_map(struct swap_info_struct *si,
unsigned long offset, int nr_pages, bool *has_cache)
{
diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c
index 25f89eba0438c..98be764fb3ecd 100644
--- a/mm/userfaultfd.c
+++ b/mm/userfaultfd.c
@@ -1190,7 +1190,6 @@ static int move_swap_pte(struct mm_struct *mm, struct vm_area_struct *dst_vma,
* Check if the swap entry is cached after acquiring the src_pte
* lock. Otherwise, we might miss a newly loaded swap cache folio.
*
- * Check swap_map directly to minimize overhead, READ_ONCE is sufficient.
* We are trying to catch newly added swap cache, the only possible case is
* when a folio is swapped in and out again staying in swap cache, using the
* same entry before the PTE check above. The PTL is acquired and released
@@ -1200,7 +1199,7 @@ static int move_swap_pte(struct mm_struct *mm, struct vm_area_struct *dst_vma,
* cache, or during the tiny synchronization window between swap cache and
* swap_map, but it will be gone very quickly, worst result is retry jitters.
*/
- if (READ_ONCE(si->swap_map[swp_offset(entry)]) & SWAP_HAS_CACHE) {
+ if (is_swap_cached(entry)) {
double_pt_unlock(dst_ptl, src_ptl);
return -EAGAIN;
}
--
2.52.0
next prev parent reply other threads:[~2026-03-18 22:30 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-18 22:29 [PATCH v4 00/21] Virtual Swap Space Nhat Pham
2026-03-18 22:29 ` [PATCH v4 01/21] mm/swap: decouple swap cache from physical swap infrastructure Nhat Pham
2026-03-18 22:29 ` [PATCH v4 02/21] swap: rearrange the swap header file Nhat Pham
2026-03-18 22:29 ` [PATCH v4 03/21] mm: swap: add an abstract API for locking out swapoff Nhat Pham
2026-03-18 22:29 ` [PATCH v4 04/21] zswap: add new helpers for zswap entry operations Nhat Pham
2026-03-18 22:29 ` Nhat Pham [this message]
2026-03-18 22:29 ` [PATCH v4 06/21] mm: swap: add a separate type for physical swap slots Nhat Pham
2026-03-18 22:29 ` [PATCH v4 07/21] mm: create scaffolds for the new virtual swap implementation Nhat Pham
2026-03-18 22:29 ` [PATCH v4 08/21] zswap: prepare zswap for swap virtualization Nhat Pham
2026-03-18 22:29 ` [PATCH v4 09/21] mm: swap: allocate a virtual swap slot for each swapped out page Nhat Pham
2026-03-19 7:56 ` Peter Zijlstra
2026-03-19 18:37 ` Nhat Pham
2026-03-19 19:26 ` Nhat Pham
2026-03-19 21:03 ` Peter Zijlstra
2026-03-19 23:27 ` Nhat Pham
2026-03-18 22:29 ` [PATCH v4 10/21] swap: move swap cache to virtual swap descriptor Nhat Pham
2026-03-18 22:29 ` [PATCH v4 11/21] zswap: move zswap entry management to the " Nhat Pham
2026-03-18 22:29 ` [PATCH v4 12/21] swap: implement the swap_cgroup API using virtual swap Nhat Pham
2026-03-18 22:29 ` [PATCH v4 13/21] swap: manage swap entry lifecycle at the virtual swap layer Nhat Pham
2026-03-18 22:29 ` [PATCH v4 14/21] mm: swap: decouple virtual swap slot from backing store Nhat Pham
2026-03-18 22:29 ` [PATCH v4 15/21] zswap: do not start zswap shrinker if there is no physical swap slots Nhat Pham
2026-03-18 22:29 ` [PATCH v4 16/21] swap: do not unnecesarily pin readahead swap entries Nhat Pham
2026-03-18 22:29 ` [PATCH v4 17/21] swapfile: remove zeromap bitmap Nhat Pham
2026-03-18 22:29 ` [PATCH v4 18/21] memcg: swap: only charge physical swap slots Nhat Pham
2026-03-18 22:29 ` [PATCH v4 19/21] swap: simplify swapoff using virtual swap Nhat Pham
2026-03-18 22:29 ` [PATCH v4 20/21] swapfile: replace the swap map with bitmaps Nhat Pham
2026-03-18 22:29 ` [PATCH v4 21/21] vswap: batch contiguous vswap free calls Nhat Pham
2026-03-18 23:12 ` [PATCH v4 00/21] Virtual Swap Space Nhat Pham
2026-03-19 21:36 ` [syzbot ci] " syzbot ci
2026-03-19 23:26 ` Nhat Pham
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=20260318222953.441758-6-nphamcs@gmail.com \
--to=nphamcs@gmail.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=apopple@nvidia.com \
--cc=axelrasmussen@google.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=bhe@redhat.com \
--cc=byungchul@sk.com \
--cc=cgroups@vger.kernel.org \
--cc=chengming.zhou@linux.dev \
--cc=chrisl@kernel.org \
--cc=corbet@lwn.net \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=gourry@gourry.net \
--cc=hannes@cmpxchg.org \
--cc=hughd@google.com \
--cc=jannh@google.com \
--cc=joshua.hahnjy@gmail.com \
--cc=kasong@tencent.com \
--cc=kernel-team@meta.com \
--cc=lance.yang@linux.dev \
--cc=lenb@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-pm@vger.kernel.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=matthew.brost@intel.com \
--cc=mhocko@suse.com \
--cc=muchun.song@linux.dev \
--cc=npache@redhat.com \
--cc=pavel@kernel.org \
--cc=peterx@redhat.com \
--cc=peterz@infradead.org \
--cc=pfalcato@suse.de \
--cc=rafael@kernel.org \
--cc=rakie.kim@sk.com \
--cc=riel@surriel.com \
--cc=roman.gushchin@linux.dev \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shakeel.butt@linux.dev \
--cc=shikemeng@huaweicloud.com \
--cc=surenb@google.com \
--cc=tglx@kernel.org \
--cc=vbabka@suse.cz \
--cc=weixugc@google.com \
--cc=ying.huang@linux.alibaba.com \
--cc=yosry.ahmed@linux.dev \
--cc=yuanchu@google.com \
--cc=zhengqi.arch@bytedance.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.