Re: [PATCH v2 2/5] mm/vmscan: move code to lru_gen_{add,del}_memcg()

From: Barry Song

Date: Tue Nov 03 2026 - 22:22:35 EST


On Tue, Nov 3, 2026 at 7:37 PM Max Kellermann <max.kellermann@xxxxxxxxx> wrote:
>
> Preparation for the following patch that adds tail caching.
>
> For simplicity, hlist_nulls_del_init_rcu() is now always used, which
> is also valid during rotation, because the entry is immediately
> reinserted under `memcg_lru.lock`.
>
> Signed-off-by: Max Kellermann <max.kellermann@xxxxxxxxx>
> ---
> mm/vmscan.c | 36 ++++++++++++++++++++++++++++--------
> 1 file changed, 28 insertions(+), 8 deletions(-)
>
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index 9959ca158ce8..aed56d452881 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -4556,6 +4556,29 @@ enum {
> MEMCG_LRU_YOUNG,
> };
>
> +static void lru_gen_add_memcg(struct lru_gen_memcg *memcg_lru,
> + struct lru_gen_folio *lrugen,
> + int gen, int bin, bool at_head)
> +{
> + struct hlist_nulls_head *head = &memcg_lru->fifo[gen][bin];
> +
> + lockdep_assert_held(&memcg_lru->lock);
> +
> + if (at_head)
> + hlist_nulls_add_head_rcu(&lrugen->list, head);
> + else
> + hlist_nulls_add_tail_rcu(&lrugen->list, head);

T.J. 's patch[1] has actually removed the needs for hlist_nulls_add_head_rcu
and it has been in mm-new branch.

> +}
> +
> +static void lru_gen_del_memcg(struct lru_gen_memcg *memcg_lru,
> + struct lru_gen_folio *lrugen,
> + int gen)
> +{
> + lockdep_assert_held(&memcg_lru->lock);
> +
> + hlist_nulls_del_init_rcu(&lrugen->list);
> +}
> +
> static void lru_gen_rotate_memcg(struct lruvec *lruvec, int op)
> {
> int seg;
> @@ -4584,12 +4607,9 @@ static void lru_gen_rotate_memcg(struct lruvec *lruvec, int op)
> WRITE_ONCE(lruvec->lrugen.seg, seg);
> WRITE_ONCE(lruvec->lrugen.gen, new);
>
> - hlist_nulls_del_rcu(&lruvec->lrugen.list);
> -
> - if (op == MEMCG_LRU_OLD)
> - hlist_nulls_add_head_rcu(&lruvec->lrugen.list, &pgdat->memcg_lru.fifo[new][bin]);
> - else
> - hlist_nulls_add_tail_rcu(&lruvec->lrugen.list, &pgdat->memcg_lru.fifo[new][bin]);
> + lru_gen_del_memcg(&pgdat->memcg_lru, &lruvec->lrugen, old);
> + lru_gen_add_memcg(&pgdat->memcg_lru, &lruvec->lrugen, new, bin,
> + op == MEMCG_LRU_OLD);

Also, MEMCG_LRU_OLD has been removed as I replied to you in v1[2]

[1] https://lore.kernel.org/linux-mm/20261028010611.3929937-3-tjmercier@xxxxxxxxxx/
[2] https://lore.kernel.org/linux-mm/CAGsJ_4zQh9HrvgaqD32_A=bSdqmPqP4oV_SxMXMEDBrHe4jjhg@xxxxxxxxxxxxxx/

Best,
Barry