Re: [PATCH v3 10/12] mm, swap: no need to truncate the scan border

From: Chris Li

Date: Thu Feb 19 2026 - 02:10:50 EST


On Tue, Feb 17, 2026 at 12:06 PM Kairui Song via B4 Relay
<devnull+kasong.tencent.com@xxxxxxxxxx> wrote:
>
> From: Kairui Song <kasong@xxxxxxxxxxx>
>
> swap_map had a static flexible size, so the last cluster won't be fully
> covered, hence the allocator needs to check the scan border to avoid
> OOB. But the swap table has a fixed-sized swap table for each cluster,
> and the slots beyond the device size are marked as bad slots. The
> allocator can simply scan all slots as usual, and any bad slots will be
> skipped.
>
> Signed-off-by: Kairui Song <kasong@xxxxxxxxxxx>

Acked-by: Chris Li <chrisl@xxxxxxxxxx>

Chris

> ---
> mm/swap.h | 2 +-
> mm/swapfile.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/mm/swap.h b/mm/swap.h
> index 0a91e21e92b1..cc410b94e91a 100644
> --- a/mm/swap.h
> +++ b/mm/swap.h
> @@ -85,7 +85,7 @@ static inline struct swap_cluster_info *__swap_offset_to_cluster(
> struct swap_info_struct *si, pgoff_t offset)
> {
> VM_WARN_ON_ONCE(percpu_ref_is_zero(&si->users)); /* race with swapoff */
> - VM_WARN_ON_ONCE(offset >= si->max);
> + VM_WARN_ON_ONCE(offset >= roundup(si->max, SWAPFILE_CLUSTER));
> return &si->cluster_info[offset / SWAPFILE_CLUSTER];
> }
>
> diff --git a/mm/swapfile.c b/mm/swapfile.c
> index 801d8092be51..df2b88c6c67b 100644
> --- a/mm/swapfile.c
> +++ b/mm/swapfile.c
> @@ -945,8 +945,8 @@ static unsigned int alloc_swap_scan_cluster(struct swap_info_struct *si,
> {
> unsigned int next = SWAP_ENTRY_INVALID, found = SWAP_ENTRY_INVALID;
> unsigned long start = ALIGN_DOWN(offset, SWAPFILE_CLUSTER);
> - unsigned long end = min(start + SWAPFILE_CLUSTER, si->max);
> unsigned int order = likely(folio) ? folio_order(folio) : 0;
> + unsigned long end = start + SWAPFILE_CLUSTER;
> unsigned int nr_pages = 1 << order;
> bool need_reclaim, ret, usable;
>
>
> --
> 2.52.0
>
>