Skip to content

Commit bda4f88

Browse files
Harry Yoojfvogel
authored andcommitted
mm: multi-gen LRU: update lrugen->nr_pages during lruvec reparenting
lruvec_reparent_relocate() does not update lrugen->nr_pages field on reparenting, leading to a DEBUG_VM warning due to non-zero nr_pages at memory cgroup exit: WARNING: CPU: 1 PID: 237 at mm/vmscan.c:5622 lru_gen_exit_memcg+0x13a/0x190 [...] RIP: 0010:lru_gen_exit_memcg+0x13a/0x190 [...] Call Trace: <TASK> mem_cgroup_css_free+0x83/0xd0 css_free_rwork_fn+0x4e/0x3b0 process_one_work+0x222/0x640 worker_thread+0x183/0x330 ? __pfx_worker_thread+0x10/0x10 kthread+0xd6/0x110 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x34/0x50 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK> lru_gen_update_size() cannot be used here because we need to update the counters for multiple folios. Introduce a new helper function lru_gen_lruvec_update_size() and call it during lruvec reparenting. Orabug: 37997618 Reviewed-by: Imran Khan <[email protected]> Signed-off-by: Harry Yoo <[email protected]>
1 parent 4ba8ebd commit bda4f88

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

include/linux/mm_inline.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,15 @@ static inline bool lru_gen_is_active(struct lruvec *lruvec, int gen)
172172
return gen == lru_gen_from_seq(max_seq) || gen == lru_gen_from_seq(max_seq - 1);
173173
}
174174

175+
static inline void lru_gen_lruvec_update_size(struct lruvec *lruvec, int gen,
176+
int type, int zone, long delta)
177+
{
178+
struct lru_gen_folio *lrugen = &lruvec->lrugen;
179+
180+
WRITE_ONCE(lrugen->nr_pages[gen][type][zone],
181+
lrugen->nr_pages[gen][type][zone] + delta);
182+
}
183+
175184
static inline void lru_gen_update_size(struct lruvec *lruvec, struct folio *folio,
176185
int old_gen, int new_gen)
177186
{

mm/memcontrol.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,10 @@ static void lruvec_reparent_relocate(struct mem_cgroup *src, struct mem_cgroup *
271271
for_each_gen_type_zone(gen, type, zone) {
272272
list_splice_tail_init(&src_lrugen->folios[gen][type][zone],
273273
&dst_lrugen->folios[gen][type][zone]);
274+
275+
long delta = src_lrugen->nr_pages[gen][type][zone];
276+
lru_gen_lruvec_update_size(src_lruvec, gen, type, zone, -delta);
277+
lru_gen_lruvec_update_size(dst_lruvec, gen, type, zone, delta);
274278
}
275279

276280
mz_src = container_of(src_lruvec, struct mem_cgroup_per_node, lruvec);

0 commit comments

Comments
 (0)