[PATCH v3 0/4] mm: drop redundant lru_add_drain in anon folio reuse paths

From: Barry Song (Xiaomi)

Date: Wed Jul 01 2026 - 20:00:10 EST


We are doing a large number of redundant lru_add_drain() calls in
both wp_can_reuse_anon_folio() and do_swap_page(), leading to LRU
lock contention and unnecessary overhead.

In wp_can_reuse_anon_folio(), we can check the refcount against the
lru_cache before deciding to drain. In do_swap_page(), the drain is
now entirely redundant after Kairui's work to route SYNC I/O through
the swapcache in the same way as ASYNC I/O.

Build the kernel within a 1 GB memcg using 20 threads with zRAM swap.
The number of lru_add_drain() calls is reduced from 276,278 to
226,318, a reduction of about 18%.

Build the kernel within an 800 MB memcg using 20 threads with zRAM
swap. The number of lru_add_drain() calls is reduced from 778,950
to 541,149, a reduction of 30.5%.

-v3:
* code improvements for patch1/4 and patch2/4 as suggested by
David;
* improve changelog as suggested by Shakeel and David;
* collect the reviewed-by and acked-by tags;
* for patch4, remove all dependency for refcount regarding
swapcache free in do_swap_page, as suggested by David

-v2:
https://lore.kernel.org/linux-mm/20260623231635.43086-1-baohua@xxxxxxxxxx/
* collect the reviewed-by and acked-by tags from Usama, Baoquan,
Shakeel, Kairui, thanks!
* add patch4 to free swapcache for non-LRU folios, as suggested
by Kairui, thanks!

-RFC:
https://lore.kernel.org/linux-mm/20260611105124.98668-1-baohua@xxxxxxxxxx/

Barry Song (Xiaomi) (4):
mm: avoid unnecessary lru drain for wp_can_reuse_anon_folio()
mm: drop stale folio_ref_count()==1 check in do_swap_page reuse logic
mm: entirely remove lru_add_drain in do_swap_page
mm: clarify the folio_free_swap() for do_swap_page()

mm/memory.c | 49 ++++++++++++++++++-------------------------------
1 file changed, 18 insertions(+), 31 deletions(-)

--
2.39.3 (Apple Git-146)