On Tue, 27 Aug 2024, Kinsey Ho wrote: > Currently, if multiple reclaimers raced on the same position, the > reclaimers which detect the race will still reclaim from the same memcg. > Instead, the reclaimers which detect the race should move on to the next > memcg in the hierarchy. > > So, in the case where multiple traversals race, jump back to the start > of the mem_cgroup_iter() function to find the next memcg in the > hierarchy to reclaim from. > > Signed-off-by: Kinsey Ho <kinseyho@xxxxxxxxxx> mm-unstable commit 954dd0848c61 needs the fix below to be merged in; but the commit after it (the 5/5) then renames "memcg" to "next", so that one has to be adjusted too. [PATCH] mm: restart if multiple traversals raced: fix mem_cgroup_iter() reset memcg to NULL before the goto restart, so that goto out_unlock does not then return an ungotten memcg, causing oopses on stale memcg in many places (often in memcg_rstat_updated()). Signed-off-by: Hugh Dickins <hughd@xxxxxxxxxx> --- mm/memcontrol.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6f66ac0ad4f0..dd82dd1e1f0a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1049,6 +1049,7 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root, if (cmpxchg(&iter->position, pos, memcg) != pos) { if (css && css != &root->css) css_put(css); + memcg = NULL; goto restart; } -- 2.35.3