From: fujunjie <fujunjie1@qq.com>
To: Andrew Morton <akpm@linux-foundation.org>,
linux-mm@kvack.org, Alexandre Ghiti <alexghiti@meta.com>,
Kairui Song <kasong@tencent.com>,
Usama Arif <usamaarif642@gmail.com>
Cc: Chris Li <chrisl@kernel.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Yosry Ahmed <yosry@kernel.org>, Nhat Pham <nphamcs@gmail.com>,
David Hildenbrand <david@kernel.org>,
Hugh Dickins <hughd@google.com>,
Roman Gushchin <roman.gushchin@linux.dev>,
Shakeel Butt <shakeel.butt@linux.dev>,
linux-kernel@vger.kernel.org, cgroups@vger.kernel.org
Subject: [RFC PATCH v2 1/9] mm/zswap: expose range state for swapin policy
Date: Fri, 29 May 2026 12:19:20 +0000 [thread overview]
Message-ID: <tencent_C78A02F3C41E15233C371816825C7DCF8708@qq.com> (raw)
In-Reply-To: <tencent_98CD9F78E48D08DC005A6471A13CFF28B60A@qq.com>
Large folio swapin needs to know whether a candidate swap range is fully
backed by zswap before it can choose an order. That decision should stay
in common swapin code, not inside zswap.
Export two zswap facts for that caller: a lockless range occupancy snapshot
and the current zswap reclaim-pressure state. The range state is
advisory only. Writeback or invalidation can change the backend after the
snapshot, so users must recheck before issuing large-folio IO.
Signed-off-by: fujunjie <fujunjie1@qq.com>
---
include/linux/zswap.h | 26 +++++++++++++++++++++++++
mm/zswap.c | 44 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+)
diff --git a/include/linux/zswap.h b/include/linux/zswap.h
index 30c193a1207e..8f9aee97517c 100644
--- a/include/linux/zswap.h
+++ b/include/linux/zswap.h
@@ -9,6 +9,18 @@ struct lruvec;
extern atomic_long_t zswap_stored_pages;
+/*
+ * Advisory zswap occupancy snapshot for a swap range. This is not a complete
+ * backend classifier; callers must recheck before depending on ALL_ZSWAP for
+ * large-folio IO.
+ */
+enum zswap_range_state {
+ ZSWAP_RANGE_NEVER_ENABLED,
+ ZSWAP_RANGE_NO_ZSWAP,
+ ZSWAP_RANGE_ALL_ZSWAP,
+ ZSWAP_RANGE_MIXED,
+};
+
#ifdef CONFIG_ZSWAP
struct zswap_lruvec_state {
@@ -27,6 +39,9 @@ struct zswap_lruvec_state {
unsigned long zswap_total_pages(void);
bool zswap_store(struct folio *folio);
int zswap_load(struct folio *folio);
+enum zswap_range_state zswap_probe_range(swp_entry_t swp,
+ unsigned int nr_pages);
+bool zswap_pool_reclaim_pressure(void);
void zswap_invalidate(swp_entry_t swp);
int zswap_swapon(int type, unsigned long nr_pages);
void zswap_swapoff(int type);
@@ -49,6 +64,17 @@ static inline int zswap_load(struct folio *folio)
return -ENOENT;
}
+static inline enum zswap_range_state zswap_probe_range(swp_entry_t swp,
+ unsigned int nr_pages)
+{
+ return ZSWAP_RANGE_NEVER_ENABLED;
+}
+
+static inline bool zswap_pool_reclaim_pressure(void)
+{
+ return false;
+}
+
static inline void zswap_invalidate(swp_entry_t swp) {}
static inline int zswap_swapon(int type, unsigned long nr_pages)
{
diff --git a/mm/zswap.c b/mm/zswap.c
index 761cd699e0a3..da5297f7bd69 100644
--- a/mm/zswap.c
+++ b/mm/zswap.c
@@ -506,6 +506,19 @@ unsigned long zswap_total_pages(void)
return total;
}
+/*
+ * Expose whether zswap reclaim pressure is active. This is a backend fact:
+ * zswap_check_limits() sets the state once the pool reaches the hard limit and
+ * keeps it set until the pool falls below the accept threshold.
+ */
+bool zswap_pool_reclaim_pressure(void)
+{
+ if (zswap_never_enabled())
+ return false;
+
+ return READ_ONCE(zswap_pool_reached_full);
+}
+
static bool zswap_check_limits(void)
{
unsigned long cur_pages = zswap_total_pages();
@@ -1559,6 +1572,37 @@ bool zswap_store(struct folio *folio)
return ret;
}
+enum zswap_range_state zswap_probe_range(swp_entry_t swp,
+ unsigned int nr_pages)
+{
+ unsigned int type = swp_type(swp);
+ pgoff_t offset = swp_offset(swp);
+ bool present = false, missing = false;
+ unsigned int i;
+
+ /*
+ * This is an advisory, lockless snapshot for common swapin admission.
+ * Callers must recheck before depending on an all-zswap range for IO:
+ * concurrent writeback or invalidation can change the backend state.
+ */
+ if (zswap_never_enabled())
+ return ZSWAP_RANGE_NEVER_ENABLED;
+
+ for (i = 0; i < nr_pages; i++) {
+ struct xarray *tree = swap_zswap_tree(swp_entry(type, offset + i));
+
+ if (xa_load(tree, offset + i))
+ present = true;
+ else
+ missing = true;
+
+ if (present && missing)
+ return ZSWAP_RANGE_MIXED;
+ }
+
+ return present ? ZSWAP_RANGE_ALL_ZSWAP : ZSWAP_RANGE_NO_ZSWAP;
+}
+
/**
* zswap_load() - load a folio from zswap
* @folio: folio to load
--
2.34.1
next prev parent reply other threads:[~2026-05-29 12:19 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-29 12:17 [RFC PATCH v2 0/9] mm: support zswap-backed large folio swapin fujunjie
2026-05-29 12:19 ` fujunjie [this message]
2026-05-29 18:35 ` [RFC PATCH v2 1/9] mm/zswap: expose range state for swapin policy Nhat Pham
2026-05-31 13:47 ` Fujunjie
2026-05-29 12:19 ` [RFC PATCH v2 2/9] mm: let swap_read_folio() report retryable zswap races fujunjie
2026-05-29 12:19 ` [RFC PATCH v2 3/9] mm/zswap: support fully zswap-backed large folio loads fujunjie
2026-05-29 18:25 ` Nhat Pham
2026-05-31 20:03 ` Fujunjie
2026-05-29 12:19 ` [RFC PATCH v2 4/9] mm: admit large swapin by backend range in swapin_sync() fujunjie
2026-05-29 14:43 ` Kairui Song
2026-05-29 14:45 ` Kairui Song
2026-05-31 12:34 ` Fujunjie
2026-05-31 12:21 ` Fujunjie
2026-05-29 18:34 ` Nhat Pham
2026-05-31 13:15 ` Fujunjie
2026-05-29 12:19 ` [RFC PATCH v2 5/9] mm: add common locality admission for zswap large swapin fujunjie
2026-05-29 19:00 ` Nhat Pham
2026-06-01 9:47 ` Fujunjie
2026-05-29 12:19 ` [RFC PATCH v2 6/9] mm: provide anon locality evidence " fujunjie
2026-05-29 19:22 ` Nhat Pham
2026-05-31 13:11 ` Fujunjie
2026-05-29 12:19 ` [RFC PATCH v2 7/9] mm/shmem: provide VMA-hint locality " fujunjie
2026-05-29 12:19 ` [RFC PATCH v2 8/9] mm: try all-zswap large swapin within swap readahead windows fujunjie
2026-05-29 12:19 ` [RFC PATCH v2 9/9] docs: mm: update THP swapin counter descriptions fujunjie
2026-05-29 18:37 ` Nhat Pham
2026-05-31 13:21 ` Fujunjie
2026-05-29 18:06 ` [RFC PATCH v2 0/9] mm: support zswap-backed large folio swapin Nhat Pham
2026-05-31 12:32 ` Fujunjie
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=tencent_C78A02F3C41E15233C371816825C7DCF8708@qq.com \
--to=fujunjie1@qq.com \
--cc=akpm@linux-foundation.org \
--cc=alexghiti@meta.com \
--cc=cgroups@vger.kernel.org \
--cc=chrisl@kernel.org \
--cc=david@kernel.org \
--cc=hannes@cmpxchg.org \
--cc=hughd@google.com \
--cc=kasong@tencent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=nphamcs@gmail.com \
--cc=roman.gushchin@linux.dev \
--cc=shakeel.butt@linux.dev \
--cc=usamaarif642@gmail.com \
--cc=yosry@kernel.org \
/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®