From: sashiko-bot@kernel.org
To: "Nhat Pham" <nphamcs@gmail.com>, akpm@linux-foundation.org
Cc: chrisl@kernel.org, kasong@tencent.com, hannes@cmpxchg.org,
mhocko@kernel.org, roman.gushchin@linux.dev,
shakeel.butt@linux.dev, yosry@kernel.org, david@kernel.org,
muchun.song@linux.dev, shikemeng@huaweicloud.com,
baoquan.he@linux.dev, baohua@kernel.org, youngjun.park@lge.com,
chengming.zhou@linux.dev, ljs@kernel.org, liam@infradead.org,
vbabka@kernel.org, rppt@kernel.org, surenb@google.com,
qi.zheng@linux.dev, axelrasmussen@google.com, yuanchu@google.com,
weixugc@google.com, riel@surriel.com, gourry@gourry.net,
haowenchao22@gmail.com, corbet@lwn.net, hughd@google.com,
baolin.wang@linux.alibaba.com, tj@kernel.org, mkoutny@suse.com,
skhan@linuxfoundation.org, rdunlap@infradead.org,
kunwu.chan@linux.dev, kernel-team@meta.com, linux-mm@kvack.org
Subject: Re: [PATCH v6 04/12] mm, swap: support physical swap as a vswap backend
Date: Thu, 22 Oct 2026 06:19:11 +0000 [thread overview]
Message-ID: <sashiko-outbox-181078@kernel.org> (raw)
In-Reply-To: <20261021060323.553433-5-nphamcs@gmail.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] mm: try_to_unuse() dirties unmapped vswap folios rejected by pageout()
- [High] mm: try_to_unuse() leaks vswap folios and slots when swap count is zero
- [High] mm: large vswap folios declined by zswap fail swapout without splitting
--
commit f1735375be4432e3cb8facdcc6b588e080aeb34c
Author: Nhat Pham <nphamcs@gmail.com>
mm, swap: support physical swap as a vswap backend
This commit adds physical swapfile support as a backend for virtual swap
entries when zswap declines a folio during swap_writeout(), tracking the
reverse mapping via vswap-tagged swap_table entries on the physical cluster.
During swapoff, try_to_unuse() reads vswap-backed physical slots into the
swap cache and releases their physical backing slots before walking process
and shmem mappings.
> diff --git a/mm/page_io.c b/mm/page_io.c
> index 61bb5c6e97595..ed8c037e4aa08 100644
> --- a/mm/page_io.c
> +++ b/mm/page_io.c
> @@ -209,6 +209,7 @@ static void swap_zeromap_folio_clear(struct folio *folio)
> */
> int swap_writeout(struct swap_io_ctx *ctx, struct folio *folio)
> {
> + swp_entry_t phys = folio->swap;
> int ret = 0;
>
> if (folio_free_swap(folio))
[ ... ]
> @@ -257,13 +264,21 @@ int swap_writeout(struct swap_io_ctx *ctx, struct folio *folio)
> }
> rcu_read_unlock();
>
> - /* A vswap folio has no physical slot to write to. */
> if (is_vswap_entry(folio->swap)) {
> + phys = folio_realloc_swap(folio);
> + if (!phys.val) {
> + folio_mark_dirty(folio);
> + return AOP_WRITEPAGE_ACTIVATE;
> + }
> + }
[Severity: High]
What happens here when a large folio (order > 0) with a virtual swap entry
is declined by zswap_store() and the underlying physical swap cannot satisfy
a high-order allocation?
During reclaim in shrink_folio_list() or shmem_writeout(), folio_alloc_swap()
allocates from vswap_si via vswap_alloc() -> cluster_alloc_swap_entry():
mm/swapfile.c:cluster_alloc_swap_entry() {
if (order && !(si->flags & SWP_BLKDEV) && !swap_is_vswap(si))
return 0;
}
Because swap_is_vswap(vswap_si) is true, vswap_alloc() succeeds for order > 0
folios even when the physical swap devices are regular swapfiles without
SWP_BLKDEV or have fragmented high-order clusters. As a result,
folio_alloc_swap() returns 0 instead of -E2BIG, bypassing the
split_folio_to_list() fallback in both shrink_folio_list() and
shmem_writeout().
Later in swap_writeout(), if zswap_store() declines the large folio,
folio_realloc_swap() -> folio_alloc_phys_swap() attempts to allocate a
contiguous physical swap range of folio_order(folio), which always fails on
non-SWP_BLKDEV swapfiles and fails when high-order physical clusters are
unavailable. swap_writeout() then marks the folio dirty and returns
AOP_WRITEPAGE_ACTIVATE without splitting it.
On subsequent reclaim passes, an anonymous large folio is already in the swap
cache with PTEs referencing its vswap slots, so shrink_folio_list() skips the
!folio_test_swapcache(folio) block where split_folio_to_list() is called:
mm/vmscan.c:shrink_folio_list() {
if (folio_test_anon(folio) && folio_test_swapbacked(folio) &&
!folio_test_swapcache(folio)) {
...
ret = folio_alloc_swap(folio);
if (ret) {
...
if (split_folio_to_list(folio, folio_list))
goto activate_locked;
}
For a large shmem folio, shmem_writeout() removes the unsplit folio from the
swap cache on AOP_WRITEPAGE_ACTIVATE without reaching its -E2BIG split path,
repeating the same vswap_alloc() success and folio_realloc_swap() failure on
every pass.
Can this cause large vswap folios declined by zswap to never split or swap
out?
> diff --git a/mm/swapfile.c b/mm/swapfile.c
> index 69fac2d905a4f..be66ac79313ce 100644
> --- a/mm/swapfile.c
> +++ b/mm/swapfile.c
[ ... ]
> @@ -3087,19 +3287,95 @@ static unsigned int find_next_to_unuse(struct swap_info_struct *si,
>
> static int try_to_unuse(unsigned int type)
> {
> + struct mempolicy *mpol = get_task_policy(current);
> struct mm_struct *prev_mm;
> struct mm_struct *mm;
> struct list_head *p;
> int retval = 0;
> struct swap_info_struct *si = swap_info[type];
> struct folio *folio;
> - swp_entry_t entry;
> - unsigned int i;
> + struct swap_io_ctx ctx;
> + swp_entry_t entry, vswap_entry, phys;
> + unsigned long swp_tb;
> + unsigned int i, j;
>
> if (!swap_usage_in_pages(si))
> goto success;
>
> retry:
> + /*
> + * Free vswap-backing slots (Vswap-tagged) first. Walk physical
> + * clusters, read the vswap entry from the rmap, ensure the data
> + * is in the swap cache, and transition PHYS to FOLIO. Freeing the
> + * physical backing is enough, so no page table walk is needed.
> + */
> + i = 0;
> + while (vswap_is_enabled() &&
> + swap_usage_in_pages(si) &&
> + !signal_pending(current) &&
> + (i = find_next_to_unuse(si, i)) != 0) {
> + swp_tb = swap_table_lookup(swp_entry(si->type, i));
> + if (!swp_tb_is_vswap(swp_tb))
> + continue;
> +
> + vswap_entry = swp_tb_vswap_to_swp_entry(swp_tb);
> +
> + folio = swap_cache_get_folio(vswap_entry);
> + if (!folio) {
> + folio = __swap_cache_alloc_folio(vswap_entry,
> + GFP_HIGHUSER_MOVABLE,
> + BIT(0), NULL, mpol,
> + NO_INTERLEAVE_INDEX);
> + if (IS_ERR(folio)) {
> + if (PTR_ERR(folio) == -ENOMEM)
> + return -ENOMEM;
> + continue;
> + }
> + folio_add_lru(folio);
> + ctx = (struct swap_io_ctx){};
> + swap_read_folio(&ctx, folio);
> + swap_read_submit(&ctx);
> + }
> + folio_lock(folio);
> +
> + if (!folio_matches_swap_entry(folio, vswap_entry)) {
> + folio_unlock(folio);
> + folio_put(folio);
> + continue;
> + }
> +
> + /*
> + * Re-validate under folio lock: rmap holds folio->swap + j
> + * for some j in [0, nr_pages). Check folio->swap still maps
> + * to the contiguous physical run that includes our slot i.
> + */
> + j = vswap_entry.val - folio->swap.val;
> + phys = vswap_to_phys(folio->swap);
> + if (!phys.val || swp_type(phys) != type ||
> + swp_offset(phys) + j != i) {
> + folio_unlock(folio);
> + folio_put(folio);
> + continue;
> + }
> +
> + folio_wait_writeback(folio);
> + folio_release_vswap_backing(folio);
> + /*
> + * Drop a folio whose read failed rather than dirtying
> + * uninitialised memory; the next fault finds no backing and
> + * gets SIGBUS.
> + */
> + if (unlikely(!folio_test_uptodate(folio)))
> + swap_cache_del_folio(folio);
> + else
> + folio_mark_dirty(folio);
[Severity: High]
Can pageout() ever write out the unmapped swap-cache folios allocated and
dirtied by this pre-pass?
When __swap_cache_alloc_folio() -> __swap_cache_alloc() allocates a fresh
swap-cache folio here, it sets PG_swapbacked and PG_swapcache, but leaves
folio->mapping as NULL because try_to_unuse() does not map the folio into a
VMA via folio_add_new_anon_rmap(). Shmem folios in the swap cache also have
folio->mapping set to NULL. As a result, folio_test_anon(folio) is false.
When shrink_folio_list() later scans one of these dirty swap-cache folios on
the LRU, folio_mapping(folio) returns &swap_space and shrink_folio_list()
calls pageout():
mm/vmscan.c:pageout() {
if (folio_ref_count(folio) != 1 + folio_nr_pages(folio) || !mapping)
return PAGE_KEEP;
if (!shmem_mapping(mapping) && !folio_test_anon(folio))
return PAGE_ACTIVATE;
if (!folio_clear_dirty_for_io(folio))
return PAGE_CLEAN;
}
Because mapping is &swap_space (!shmem_mapping(mapping)) and
folio_test_anon(folio) is false, pageout() unconditionally returns
PAGE_ACTIVATE before reaching swap_writeout(). Wouldn't this prevent reclaim
from ever writing these dirtied vswap folios out to zswap or another swap
device until they are faulted in?
> + folio_unlock(folio);
> + folio_put(folio);
> + }
[Severity: High]
Does this pre-pass leak the folio, its vswap slot, and its memcg swap charge
if the vswap entry's swap count is 0 (or drops to 0 concurrently)?
There are two ways the vswap entry can have swap_count == 0 when reaching
folio_release_vswap_backing(folio):
1. While try_to_unuse() holds the folio lock (during swap_read_folio() IO or
before folio_unlock()), the owning process exits or zaps the swap PTE via
zap_nonpresent_ptes() -> free_swap_and_cache_nr() ->
swap_put_entries_cluster(). That path decrements the vswap slot's swap
count to 0 and calls __try_to_reclaim_swap(), which fails folio_trylock()
and bails out expecting the folio lock holder to clean up.
2. A prior read fault in do_swap_page() mapped the folio, decremented the
vswap entry's swap count to 0 via folio_put_swap(), and left the folio in
the swap cache because should_try_to_free_swap() saw
folio_phys_swap_backed(folio) == true.
After folio_release_vswap_backing(folio) frees the physical slot,
folio_phys_swap_backed(folio) becomes false, and try_to_unuse() marks the
folio dirty without calling folio_free_swap(folio) (unlike the post-pass at
the end of try_to_unuse()).
In the first case, the unlocked folio is unmapped, has folio->mapping == NULL
(!folio_test_anon(folio)), has swap_count == 0, and is no longer physically
backed. pageout() rejects it with PAGE_ACTIVATE before reaching
swap_writeout() -> folio_free_swap(), and the activate_locked path in
shrink_folio_list() also skips folio_free_swap() because
folio_phys_swap_backed(folio) is now false:
mm/vmscan.c:shrink_folio_list() {
activate_locked:
/* Not a candidate for swapping, so reclaim swap space. */
if (folio_test_swapcache(folio) &&
((mem_cgroup_swap_full(folio) && folio_phys_swap_backed(folio)) ||
folio_test_mlocked(folio)))
folio_free_swap(folio);
}
Should try_to_unuse() check or call folio_free_swap(folio) when releasing the
vswap backing here?
>
> + if (!swap_usage_in_pages(si))
> + goto success;
> +
> retval = shmem_unuse(type);
[ ... ]
完美 (Wait: oops, don't write any extra text after the report! Let's make sure the final output has only the report and ends with a blank line.)
Let's review the whole text and output it cleanly.commit f1735375be4432e3cb8facdcc6b588e080aeb34c
Author: Nhat Pham <nphamcs@gmail.com>
mm, swap: support physical swap as a vswap backend
This commit adds physical swapfile support as a backend for virtual swap
entries when zswap declines a folio during swap_writeout(), tracking the
reverse mapping via vswap-tagged swap_table entries on the physical cluster.
During swapoff, try_to_unuse() reads vswap-backed physical slots into the
swap cache and releases their physical backing slots before walking process
and shmem mappings.
> diff --git a/mm/page_io.c b/mm/page_io.c
> index 61bb5c6e97595..ed8c037e4aa08 100644
> --- a/mm/page_io.c
> +++ b/mm/page_io.c
> @@ -209,6 +209,7 @@ static void swap_zeromap_folio_clear(struct folio *folio)
> */
> int swap_writeout(struct swap_io_ctx *ctx, struct folio *folio)
> {
> + swp_entry_t phys = folio->swap;
> int ret = 0;
>
> if (folio_free_swap(folio))
[ ... ]
> @@ -257,13 +264,21 @@ int swap_writeout(struct swap_io_ctx *ctx, struct folio *folio)
> }
> rcu_read_unlock();
>
> - /* A vswap folio has no physical slot to write to. */
> if (is_vswap_entry(folio->swap)) {
> + phys = folio_realloc_swap(folio);
> + if (!phys.val) {
> + folio_mark_dirty(folio);
> + return AOP_WRITEPAGE_ACTIVATE;
> + }
> + }
[Severity: High]
What happens here when a large folio (order > 0) with a virtual swap entry
is declined by zswap_store() and the underlying physical swap cannot satisfy
a high-order allocation?
During reclaim in shrink_folio_list() or shmem_writeout(), folio_alloc_swap()
allocates from vswap_si via vswap_alloc() -> cluster_alloc_swap_entry():
mm/swapfile.c:cluster_alloc_swap_entry() {
if (order && !(si->flags & SWP_BLKDEV) && !swap_is_vswap(si))
return 0;
}
Because swap_is_vswap(vswap_si) is true, vswap_alloc() succeeds for order > 0
folios even when the physical swap devices are regular swapfiles without
SWP_BLKDEV or have fragmented high-order clusters. As a result,
folio_alloc_swap() returns 0 instead of -E2BIG, bypassing the
split_folio_to_list() fallback in both shrink_folio_list() and
shmem_writeout().
Later in swap_writeout(), if zswap_store() declines the large folio,
folio_realloc_swap() -> folio_alloc_phys_swap() attempts to allocate a
contiguous physical swap range of folio_order(folio), which always fails on
non-SWP_BLKDEV swapfiles and fails when high-order physical clusters are
unavailable. swap_writeout() then marks the folio dirty and returns
AOP_WRITEPAGE_ACTIVATE without splitting it.
On subsequent reclaim passes, an anonymous large folio is already in the swap
cache with PTEs referencing its vswap slots, so shrink_folio_list() skips the
!folio_test_swapcache(folio) block where split_folio_to_list() is called:
mm/vmscan.c:shrink_folio_list() {
if (folio_test_anon(folio) && folio_test_swapbacked(folio) &&
!folio_test_swapcache(folio)) {
...
ret = folio_alloc_swap(folio);
if (ret) {
...
if (split_folio_to_list(folio, folio_list))
goto activate_locked;
}
For a large shmem folio, shmem_writeout() removes the unsplit folio from the
swap cache on AOP_WRITEPAGE_ACTIVATE without reaching its -E2BIG split path,
repeating the same vswap_alloc() success and folio_realloc_swap() failure on
every pass.
Can this cause large vswap folios declined by zswap to never split or swap
out?
> diff --git a/mm/swapfile.c b/mm/swapfile.c
> index 69fac2d905a4f..be66ac79313ce 100644
> --- a/mm/swapfile.c
> +++ b/mm/swapfile.c
[ ... ]
> @@ -3087,19 +3287,95 @@ static unsigned int find_next_to_unuse(struct swap_info_struct *si,
>
> static int try_to_unuse(unsigned int type)
> {
> + struct mempolicy *mpol = get_task_policy(current);
> struct mm_struct *prev_mm;
> struct mm_struct *mm;
> struct list_head *p;
> int retval = 0;
> struct swap_info_struct *si = swap_info[type];
> struct folio *folio;
> - swp_entry_t entry;
> - unsigned int i;
> + struct swap_io_ctx ctx;
> + swp_entry_t entry, vswap_entry, phys;
> + unsigned long swp_tb;
> + unsigned int i, j;
>
> if (!swap_usage_in_pages(si))
> goto success;
>
> retry:
> + /*
> + * Free vswap-backing slots (Vswap-tagged) first. Walk physical
> + * clusters, read the vswap entry from the rmap, ensure the data
> + * is in the swap cache, and transition PHYS to FOLIO. Freeing the
> + * physical backing is enough, so no page table walk is needed.
> + */
> + i = 0;
> + while (vswap_is_enabled() &&
> + swap_usage_in_pages(si) &&
> + !signal_pending(current) &&
> + (i = find_next_to_unuse(si, i)) != 0) {
> + swp_tb = swap_table_lookup(swp_entry(si->type, i));
> + if (!swp_tb_is_vswap(swp_tb))
> + continue;
> +
> + vswap_entry = swp_tb_vswap_to_swp_entry(swp_tb);
> +
> + folio = swap_cache_get_folio(vswap_entry);
> + if (!folio) {
> + folio = __swap_cache_alloc_folio(vswap_entry,
> + GFP_HIGHUSER_MOVABLE,
> + BIT(0), NULL, mpol,
> + NO_INTERLEAVE_INDEX);
> + if (IS_ERR(folio)) {
> + if (PTR_ERR(folio) == -ENOMEM)
> + return -ENOMEM;
> + continue;
> + }
> + folio_add_lru(folio);
> + ctx = (struct swap_io_ctx){};
> + swap_read_folio(&ctx, folio);
> + swap_read_submit(&ctx);
> + }
> + folio_lock(folio);
> +
> + if (!folio_matches_swap_entry(folio, vswap_entry)) {
> + folio_unlock(folio);
> + folio_put(folio);
> + continue;
> + }
> +
> + /*
> + * Re-validate under folio lock: rmap holds folio->swap + j
> + * for some j in [0, nr_pages). Check folio->swap still maps
> + * to the contiguous physical run that includes our slot i.
> + */
> + j = vswap_entry.val - folio->swap.val;
> + phys = vswap_to_phys(folio->swap);
> + if (!phys.val || swp_type(phys) != type ||
> + swp_offset(phys) + j != i) {
> + folio_unlock(folio);
> + folio_put(folio);
> + continue;
> + }
> +
> + folio_wait_writeback(folio);
> + folio_release_vswap_backing(folio);
> + /*
> + * Drop a folio whose read failed rather than dirtying
> + * uninitialised memory; the next fault finds no backing and
> + * gets SIGBUS.
> + */
> + if (unlikely(!folio_test_uptodate(folio)))
> + swap_cache_del_folio(folio);
> + else
> + folio_mark_dirty(folio);
[Severity: High]
Can pageout() ever write out the unmapped swap-cache folios allocated and
dirtied by this pre-pass?
When __swap_cache_alloc_folio() -> __swap_cache_alloc() allocates a fresh
swap-cache folio here, it sets PG_swapbacked and PG_swapcache, but leaves
folio->mapping as NULL because try_to_unuse() does not map the folio into a
VMA via folio_add_new_anon_rmap(). Shmem folios in the swap cache also have
folio->mapping set to NULL. As a result, folio_test_anon(folio) is false.
When shrink_folio_list() later scans one of these dirty swap-cache folios on
the LRU, folio_mapping(folio) returns &swap_space and shrink_folio_list()
calls pageout():
mm/vmscan.c:pageout() {
if (folio_ref_count(folio) != 1 + folio_nr_pages(folio) || !mapping)
return PAGE_KEEP;
if (!shmem_mapping(mapping) && !folio_test_anon(folio))
return PAGE_ACTIVATE;
if (!folio_clear_dirty_for_io(folio))
return PAGE_CLEAN;
}
Because mapping is &swap_space (!shmem_mapping(mapping)) and
folio_test_anon(folio) is false, pageout() unconditionally returns
PAGE_ACTIVATE before reaching swap_writeout(). Wouldn't this prevent reclaim
from ever writing these dirtied vswap folios out to zswap or another swap
device until they are faulted in?
> + folio_unlock(folio);
> + folio_put(folio);
> + }
[Severity: High]
Does this pre-pass leak the folio, its vswap slot, and its memcg swap charge
if the vswap entry's swap count is 0 (or drops to 0 concurrently)?
There are two ways the vswap entry can have swap_count == 0 when reaching
folio_release_vswap_backing(folio):
1. While try_to_unuse() holds the folio lock (during swap_read_folio() IO or
before folio_unlock()), the owning process exits or zaps the swap PTE via
zap_nonpresent_ptes() -> free_swap_and_cache_nr() ->
swap_put_entries_cluster(). That path decrements the vswap slot's swap
count to 0 and calls __try_to_reclaim_swap(), which fails folio_trylock()
and bails out expecting the folio lock holder to clean up.
2. A prior read fault in do_swap_page() mapped the folio, decremented the
vswap entry's swap count to 0 via folio_put_swap(), and left the folio in
the swap cache because should_try_to_free_swap() saw
folio_phys_swap_backed(folio) == true.
After folio_release_vswap_backing(folio) frees the physical slot,
folio_phys_swap_backed(folio) becomes false, and try_to_unuse() marks the
folio dirty without calling folio_free_swap(folio) (unlike the post-pass at
the end of try_to_unuse()).
In the first case, the unlocked folio is unmapped, has folio->mapping == NULL
(!folio_test_anon(folio)), has swap_count == 0, and is no longer physically
backed. pageout() rejects it with PAGE_ACTIVATE before reaching
swap_writeout() -> folio_free_swap(), and the activate_locked path in
shrink_folio_list() also skips folio_free_swap() because
folio_phys_swap_backed(folio) is now false:
mm/vmscan.c:shrink_folio_list() {
activate_locked:
/* Not a candidate for swapping, so reclaim swap space. */
if (folio_test_swapcache(folio) &&
((mem_cgroup_swap_full(folio) && folio_phys_swap_backed(folio)) ||
folio_test_mlocked(folio)))
folio_free_swap(folio);
}
Should try_to_unuse() check or call folio_free_swap(folio) when releasing the
vswap backing here?
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261021060323.553433-1-nphamcs@gmail.com?part=4
next prev parent reply other threads:[~2026-10-22 6:19 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-21 6:03 [PATCH v6 00/12] Virtual Swap Space (Swap Table Edition) Nhat Pham
2026-10-21 6:03 ` [PATCH v6 01/12] mm, swap: add virtual swap device infrastructure Nhat Pham
2026-10-21 6:03 ` [PATCH v6 02/12] mm, swap: support zswap and zero-filled swap pages as vswap backends Nhat Pham
2026-10-21 6:03 ` [PATCH v6 03/12] mm, swap: prepare the swap IO path for vswap Nhat Pham
2026-10-21 6:03 ` [PATCH v6 04/12] mm, swap: support physical swap as a vswap backend Nhat Pham
2026-10-22 6:19 ` sashiko-bot [this message]
2026-10-21 6:03 ` [PATCH v6 05/12] mm, swap: enable THP swapin for vswap entries Nhat Pham
2026-10-22 6:19 ` sashiko-bot
2026-10-21 6:03 ` [PATCH v6 06/12] mm, swap: write back vswap zswap entries to physical swap Nhat Pham
2026-10-22 6:19 ` sashiko-bot
2026-10-21 6:03 ` [PATCH v6 07/12] mm, swap: reclaim physical slots backing cache-only vswap entries Nhat Pham
2026-10-22 6:19 ` sashiko-bot
2026-10-21 6:03 ` [PATCH v6 08/12] mm, swap: only charge physical swap entries Nhat Pham
2026-10-22 6:19 ` sashiko-bot
2026-10-21 6:03 ` [PATCH v6 09/12] mm, swap: add debugfs counters for vswap Nhat Pham
2026-10-21 6:18 ` [PATCH v6 10/12] mm, swap: defer memcg_table allocation for physical swap clusters Nhat Pham
2026-10-22 6:19 ` sashiko-bot
2026-10-21 6:18 ` [PATCH v6 11/12] mm, swap: add vmstat and memcg counters for vswap Nhat Pham
2026-10-21 6:18 ` [RFC PATCH v6 12/12] mm, swap: back vswap clusters with a VM_SPARSE array Nhat Pham
2026-10-22 6:19 ` sashiko-bot
2026-10-22 2:36 ` [PATCH v6 00/12] Virtual Swap Space (Swap Table Edition) Gregory Price (Meta)
2026-10-22 17:03 ` 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=sashiko-outbox-181078@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=axelrasmussen@google.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=baoquan.he@linux.dev \
--cc=chengming.zhou@linux.dev \
--cc=chrisl@kernel.org \
--cc=corbet@lwn.net \
--cc=david@kernel.org \
--cc=gourry@gourry.net \
--cc=hannes@cmpxchg.org \
--cc=haowenchao22@gmail.com \
--cc=hughd@google.com \
--cc=kasong@tencent.com \
--cc=kernel-team@meta.com \
--cc=kunwu.chan@linux.dev \
--cc=liam@infradead.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=mhocko@kernel.org \
--cc=mkoutny@suse.com \
--cc=muchun.song@linux.dev \
--cc=nphamcs@gmail.com \
--cc=qi.zheng@linux.dev \
--cc=rdunlap@infradead.org \
--cc=riel@surriel.com \
--cc=roman.gushchin@linux.dev \
--cc=rppt@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=shakeel.butt@linux.dev \
--cc=shikemeng@huaweicloud.com \
--cc=skhan@linuxfoundation.org \
--cc=surenb@google.com \
--cc=tj@kernel.org \
--cc=vbabka@kernel.org \
--cc=weixugc@google.com \
--cc=yosry@kernel.org \
--cc=youngjun.park@lge.com \
--cc=yuanchu@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox