Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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: 2732acda82c9 ("mm, swap: use swap cache as the swap in synchronize layer")
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
Acked-by: Kairui Song <kasong@tencent.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Reviewed-by: Nhat Pham <nphamcs@gmail.com>
Acked-by: Chris 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: Andrew Morton <akpm@linux-foundation.org>

authored by

Alexandre Ghiti and committed by
Andrew Morton
9acbe135 9594f05e

+4 -5
+4 -5
mm/swap_state.c
··· 472 472 473 473 __folio_set_locked(folio); 474 474 __folio_set_swapbacked(folio); 475 + 476 + if (!charged && mem_cgroup_swapin_charge_folio(folio, NULL, gfp, entry)) 477 + goto failed; 478 + 475 479 for (;;) { 476 480 ret = swap_cache_add_folio(folio, entry, &shadow); 477 481 if (!ret) ··· 494 490 swapcache = swap_cache_get_folio(entry); 495 491 if (swapcache) 496 492 goto failed; 497 - } 498 - 499 - if (!charged && mem_cgroup_swapin_charge_folio(folio, NULL, gfp, entry)) { 500 - swap_cache_del_folio(folio); 501 - goto failed; 502 493 } 503 494 504 495 memcg1_swapin(entry, folio_nr_pages(folio));