From: Fujunjie <fujunjie1@qq.com>
To: Nhat Pham <nphamcs@gmail.com>
Cc: 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>, Chris Li <chrisl@kernel.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Yosry Ahmed <yosry@kernel.org>,
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: Re: [RFC PATCH v2 1/9] mm/zswap: expose range state for swapin policy
Date: Sun, 31 May 2026 21:47:46 +0800 [thread overview]
Message-ID: <tencent_DAA37C24E8A6C1828BABF3B941517B3EC705@qq.com> (raw)
In-Reply-To: <CAKEwX=NUQb5b4T49dbRV0_41QYRRuLkQNUg+FVDpJiobCCCh7g@mail.gmail.com>
On 5/30/2026 2:35 AM, Nhat Pham wrote:
> On Fri, May 29, 2026 at 5:19 AM fujunjie <fujunjie1@qq.com> wrote:
>>
>> 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;
>> + }
>
> Can we use xas_load() to make this check more efficient? IIUC,
> xa_load() walks the tree every time.
>
> (We used to use a bitmap here back in frontswap days. Good times....)
Thanks for your review.
I'll switch this to xas_load() in the v3 version.
next prev parent reply other threads:[~2026-05-31 13:47 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 ` [RFC PATCH v2 1/9] mm/zswap: expose range state for swapin policy fujunjie
2026-05-29 18:35 ` Nhat Pham
2026-05-31 13:47 ` Fujunjie [this message]
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_DAA37C24E8A6C1828BABF3B941517B3EC705@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®