From: Kefeng Wang <wangkefeng.wang@huawei.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: <linux-mm@kvack.org>, Chengming Zhou <chengming.zhou@linux.dev>,
Johannes Weiner <hannes@cmpxchg.org>,
Kairui Song <kasong@tencent.com>, Nhat Pham <nphamcs@gmail.com>,
Yosry Ahmed <yosryahmed@google.com>,
Kefeng Wang <wangkefeng.wang@huawei.com>
Subject: [PATCH v3 1/3] mm: zswap: convert zswap_invalidate() to take a range
Date: Thu, 10 Sep 2026 20:35:42 +0800 [thread overview]
Message-ID: <20260910123544.818146-2-wangkefeng.wang@huawei.com> (raw)
In-Reply-To: <20260910123544.818146-1-wangkefeng.wang@huawei.com>
zswap_invalidate() takes a swp_entry_t only to unpack it right back
into type and offset, and both callers already have those values in
hand. Pass type, offset, and nr_entries directly so swap_range_free()
can invalidate an entire range in one call instead of looping in the
caller.
Suggested-by: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
---
include/linux/zswap.h | 8 ++++++--
mm/swapfile.c | 4 +---
mm/zswap.c | 29 +++++++++++++++++++----------
3 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/include/linux/zswap.h b/include/linux/zswap.h
index 30c193a1207e..df6cafbe95dc 100644
--- a/include/linux/zswap.h
+++ b/include/linux/zswap.h
@@ -27,7 +27,7 @@ struct zswap_lruvec_state {
unsigned long zswap_total_pages(void);
bool zswap_store(struct folio *folio);
int zswap_load(struct folio *folio);
-void zswap_invalidate(swp_entry_t swp);
+void zswap_invalidate(int type, pgoff_t offset, unsigned long nr_entries);
int zswap_swapon(int type, unsigned long nr_pages);
void zswap_swapoff(int type);
void zswap_memcg_offline_cleanup(struct mem_cgroup *memcg);
@@ -49,7 +49,11 @@ static inline int zswap_load(struct folio *folio)
return -ENOENT;
}
-static inline void zswap_invalidate(swp_entry_t swp) {}
+static inline void zswap_invalidate(int type, pgoff_t offset,
+ unsigned long nr_entries)
+{
+}
+
static inline int zswap_swapon(int type, unsigned long nr_pages)
{
return 0;
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 05d3408396f9..891379c95a01 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -1316,10 +1316,8 @@ static void swap_range_free(struct swap_info_struct *si, unsigned long offset,
{
unsigned long end = offset + nr_entries - 1;
void (*swap_slot_free_notify)(struct block_device *, unsigned long);
- unsigned int i;
- for (i = 0; i < nr_entries; i++)
- zswap_invalidate(swp_entry(si->type, offset + i));
+ zswap_invalidate(si->type, offset, nr_entries);
if (si->flags & SWP_BLKDEV)
swap_slot_free_notify =
diff --git a/mm/zswap.c b/mm/zswap.c
index a12b6452a225..79a66093d7ec 100644
--- a/mm/zswap.c
+++ b/mm/zswap.c
@@ -228,10 +228,15 @@ static bool zswap_has_pool;
/* One swap address space for each 64M swap space */
#define ZSWAP_ADDRESS_SPACE_SHIFT 14
#define ZSWAP_ADDRESS_SPACE_PAGES (1 << ZSWAP_ADDRESS_SPACE_SHIFT)
+
+static inline struct xarray *zswap_tree(int type, pgoff_t offset)
+{
+ return &zswap_trees[type][offset >> ZSWAP_ADDRESS_SPACE_SHIFT];
+}
+
static inline struct xarray *swap_zswap_tree(swp_entry_t swp)
{
- return &zswap_trees[swp_type(swp)][swp_offset(swp)
- >> ZSWAP_ADDRESS_SPACE_SHIFT];
+ return zswap_tree(swp_type(swp), swp_offset(swp));
}
#define zswap_pool_debug(msg, p) \
@@ -1659,18 +1664,22 @@ int zswap_load(struct folio *folio)
return 0;
}
-void zswap_invalidate(swp_entry_t swp)
+void zswap_invalidate(int type, pgoff_t offset, unsigned long nr_entries)
{
- pgoff_t offset = swp_offset(swp);
- struct xarray *tree = swap_zswap_tree(swp);
struct zswap_entry *entry;
+ struct xarray *tree;
+ unsigned long i;
- if (xa_empty(tree))
- return;
+ for (i = 0; i < nr_entries; i++) {
+ tree = zswap_tree(type, offset + i);
- entry = xa_erase(tree, offset);
- if (entry)
- zswap_entry_free(entry);
+ if (xa_empty(tree))
+ continue;
+
+ entry = xa_erase(tree, offset + i);
+ if (entry)
+ zswap_entry_free(entry);
+ }
}
int zswap_swapon(int type, unsigned long nr_pages)
--
2.55.0
next prev parent reply other threads:[~2026-09-10 12:36 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 12:35 [PATCH v3 0/3] mm: zswap: optimize zswap invalidate and store Kefeng Wang
2026-09-10 12:35 ` Kefeng Wang [this message]
2026-09-10 14:08 ` [PATCH v3 1/3] mm: zswap: convert zswap_invalidate() to take a range Yosry Ahmed
2026-09-10 19:32 ` Johannes Weiner
2026-09-10 12:35 ` [PATCH v3 2/3] mm: zswap: skip xarray walk in zswap_invalidate() when zswap is unused Kefeng Wang
2026-09-10 14:08 ` Yosry Ahmed
2026-09-10 19:32 ` Johannes Weiner
2026-09-10 12:35 ` [PATCH v3 3/3] mm: zswap: reuse zswap_invalidate() in zswap_store() Kefeng Wang
2026-09-10 14:09 ` Yosry Ahmed
2026-09-10 19:33 ` Johannes Weiner
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=20260910123544.818146-2-wangkefeng.wang@huawei.com \
--to=wangkefeng.wang@huawei.com \
--cc=akpm@linux-foundation.org \
--cc=chengming.zhou@linux.dev \
--cc=hannes@cmpxchg.org \
--cc=kasong@tencent.com \
--cc=linux-mm@kvack.org \
--cc=nphamcs@gmail.com \
--cc=yosryahmed@google.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.