Commit 9e0d0ddf authored by Alexandre Ghiti's avatar Alexandre Ghiti Committed by Andrew Morton
Browse files

mm/swap: fix swap cache memcg accounting

The swap readahead path was recently refactored and while doing this, the
order between the charging of the folio in the memcg and the addition of
the folio in the swap cache was inverted.

Since the accounting of the folio is done while adding the folio to the
swap cache and the folio is not charged in the memcg yet, the accounting
is then done at the node level, which is wrong.

Fix this by charging the folio in the memcg before adding it to the swap cache.

Link: https://lkml.kernel.org/r/20260320050601.1833108-1-alex@ghiti.fr


Fixes: 2732acda ("mm, swap: use swap cache as the swap in synchronize layer")
Signed-off-by: default avatarAlexandre Ghiti <alex@ghiti.fr>
Acked-by: default avatarKairui Song <kasong@tencent.com>
Acked-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
Reviewed-by: default avatarNhat Pham <nphamcs@gmail.com>
Acked-by: default avatarChris Li <chrisl@kernel.org>
Cc: Alexandre Ghiti <alex@ghiti.fr>
Cc: Baoquan He <bhe@redhat.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Kemeng Shi <shikemeng@huaweicloud.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 26d3dca2
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -494,6 +494,10 @@ static struct folio *__swap_cache_prepare_and_add(swp_entry_t entry,

	__folio_set_locked(folio);
	__folio_set_swapbacked(folio);

	if (!charged && mem_cgroup_swapin_charge_folio(folio, NULL, gfp, entry))
		goto failed;

	for (;;) {
		ret = swap_cache_add_folio(folio, entry, &shadow);
		if (!ret)
@@ -514,11 +518,6 @@ static struct folio *__swap_cache_prepare_and_add(swp_entry_t entry,
			goto failed;
	}

	if (!charged && mem_cgroup_swapin_charge_folio(folio, NULL, gfp, entry)) {
		swap_cache_del_folio(folio);
		goto failed;
	}

	memcg1_swapin(entry, folio_nr_pages(folio));
	if (shadow)
		workingset_refault(folio, shadow);