Commit f5e31a19 authored by Youngjun Park's avatar Youngjun Park Committed by Andrew Morton
Browse files

mm: swap: remove duplicate nr_swap_pages decrement in get_swap_page_of_type()

After commit 4f78252d, nr_swap_pages is decremented in
swap_range_alloc(). Since cluster_alloc_swap_entry() calls
swap_range_alloc() internally, the decrement in get_swap_page_of_type()
causes double-decrementing.

As a representative userspace-visible runtime example of the impact,
/proc/meminfo reports increasingly inaccurate SwapFree values.  The
discrepancy grows with each swap allocation, and during hibernation
when large amounts of memory are written to swap, the reported value
can deviate significantly from actual available swap space, misleading
users and monitoring tools.  

Remove the duplicate decrement.

Link: https://lkml.kernel.org/r/20251102082456.79807-1-youngjun.park@lge.com


Fixes: 4f78252d ("mm: swap: move nr_swap_pages counter decrement from folio_alloc_swap() to swap_range_alloc()")
Signed-off-by: default avatarYoungjun Park <youngjun.park@lge.com>
Acked-by: default avatarChris Li <chrisl@kernel.org>
Reviewed-by: default avatarBarry Song <baohua@kernel.org>
Reviewed-by: default avatarKairui Song <kasong@tencent.com>
Acked-by: default avatarNhat Pham <nphamcs@gmail.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Kemeng Shi <shikemeng@huaweicloud.com>
Cc: <stable@vger.kernel.org> [6.17+]
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 1c2a936e
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -2005,10 +2005,8 @@ swp_entry_t get_swap_page_of_type(int type)
			local_lock(&percpu_swap_cluster.lock);
			offset = cluster_alloc_swap_entry(si, 0, 1);
			local_unlock(&percpu_swap_cluster.lock);
			if (offset) {
			if (offset)
				entry = swp_entry(si->type, offset);
				atomic_long_dec(&nr_swap_pages);
			}
		}
		put_swap_device(si);
	}