Skip to content

Commit bb4924b

Browse files
Harry Yoojfvogel
authored andcommitted
mm: multi-gen LRU: skip rotation of offlined memcgs
Commit cc65a5d ("mm: memcontrol: use obj_cgroup APIs to charge the LRU pages") removes memcgs from the per-node memcg-LRU list when they are offlined. However, because the list is RCU-protected, shrink_many() can still see an offlined memcg and try to rotate: mem_cgroup_tryget() can grab a reference to offline memcgs, leading to lru_gen_rotate_memcg(). That function assumes the memcg is still on the list and will crash if it has already been removed: BUG: kernel NULL pointer dereference, address: 0000000000000000 #PF: supervisor write access in kernel mode #PF: error_code(0x0002) - not-present page [...] RIP: 0010:lru_gen_rotate_memcg+0x18a/0x2f0 [...] Call Trace: <TASK> shrink_many+0x254/0x8a0 ? shrink_many+0x73/0x8a0 shrink_node+0x3e3/0x440 ? __raw_spin_lock_irqsave+0x49/0x70 balance_pgdat+0x2d7/0x7d0 kswapd+0x114/0x1e0 ? __pfx_kswapd+0x10/0x10 kthread+0xd3/0x110 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x31/0x50 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK> Switch to mem_cgroup_tryget_online() so that offlined memcgs are skipped. Drop lru_gen_release_memcg(); offlining already removes the memcg from the list, so nothing is left to do at release step. Note that it is still feasible to call lru_gen_offline_memcg() in shrink_many() to prevent kswapd from waiting for memcgs to be offlined in a workqueue (See commit 6867c7a ("mm: multi-gen LRU: don't spin during memcg release") for more detail). Orabug: 37997501 Fixes: cc65a5d ("mm: memcontrol: use obj_cgroup APIs to charge the LRU pages") Reviewed-by: Sidhartha Kumar <[email protected]> Reviewed-by: Imran Khan <[email protected]> Signed-off-by: Harry Yoo <[email protected]>
1 parent 77a6987 commit bb4924b

File tree

3 files changed

+2
-13
lines changed

3 files changed

+2
-13
lines changed

include/linux/mmzone.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,6 @@ void lru_gen_init_memcg(struct mem_cgroup *memcg);
562562
void lru_gen_exit_memcg(struct mem_cgroup *memcg);
563563
void lru_gen_online_memcg(struct mem_cgroup *memcg);
564564
void lru_gen_offline_memcg(struct mem_cgroup *memcg);
565-
void lru_gen_release_memcg(struct mem_cgroup *memcg);
566565
void lru_gen_soft_reclaim(struct mem_cgroup *memcg, int nid);
567566

568567
#else /* !CONFIG_LRU_GEN */
@@ -596,10 +595,6 @@ static inline void lru_gen_offline_memcg(struct mem_cgroup *memcg)
596595
{
597596
}
598597

599-
static inline void lru_gen_release_memcg(struct mem_cgroup *memcg)
600-
{
601-
}
602-
603598
static inline void lru_gen_soft_reclaim(struct mem_cgroup *memcg, int nid)
604599
{
605600
}

mm/memcontrol.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3851,7 +3851,6 @@ static void mem_cgroup_css_released(struct cgroup_subsys_state *css)
38513851
struct mem_cgroup *memcg = mem_cgroup_from_css(css);
38523852

38533853
invalidate_reclaim_iterators(memcg);
3854-
lru_gen_release_memcg(memcg);
38553854
}
38563855

38573856
static void mem_cgroup_css_free(struct cgroup_subsys_state *css)

mm/vmscan.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4249,11 +4249,6 @@ void lru_gen_online_memcg(struct mem_cgroup *memcg)
42494249
}
42504250

42514251
void lru_gen_offline_memcg(struct mem_cgroup *memcg)
4252-
{
4253-
lru_gen_release_memcg(memcg);
4254-
}
4255-
4256-
void lru_gen_release_memcg(struct mem_cgroup *memcg)
42574252
{
42584253
int gen;
42594254
int nid;
@@ -4903,8 +4898,8 @@ static void shrink_many(struct pglist_data *pgdat, struct scan_control *sc)
49034898
lruvec = container_of(lrugen, struct lruvec, lrugen);
49044899
memcg = lruvec_memcg(lruvec);
49054900

4906-
if (!mem_cgroup_tryget(memcg)) {
4907-
lru_gen_release_memcg(memcg);
4901+
if (!mem_cgroup_tryget_online(memcg)) {
4902+
lru_gen_offline_memcg(memcg);
49084903
memcg = NULL;
49094904
continue;
49104905
}

0 commit comments

Comments
 (0)