Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm/damon/core: get memcg reference before access

The commit b74a120bcf507 ("mm/damon/core: implement
DAMOS_QUOTA_NODE_MEMCG_USED_BP") added accesses to memcg structure without
getting reference to it. This is unsafe. Let's get the reference before
accessing the memcg.

Link: https://lkml.kernel.org/r/20251225002904.139543-1-shakeel.butt@linux.dev
Fixes: b74a120bcf507 ("mm/damon/core: implement DAMOS_QUOTA_NODE_MEMCG_USED_BP")
Signed-off-by: Shakeel Butt <shakeel.butt@linux.dev>
Reviewed-by: SeongJae Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Shakeel Butt and committed by
Andrew Morton
a38be546 582f0f38

+6 -2
+6 -2
mm/damon/core.c
··· 2051 2051 2052 2052 rcu_read_lock(); 2053 2053 memcg = mem_cgroup_from_id(goal->memcg_id); 2054 - rcu_read_unlock(); 2055 - if (!memcg) { 2054 + if (!memcg || !mem_cgroup_tryget(memcg)) { 2055 + rcu_read_unlock(); 2056 2056 if (goal->metric == DAMOS_QUOTA_NODE_MEMCG_USED_BP) 2057 2057 return 0; 2058 2058 else /* DAMOS_QUOTA_NODE_MEMCG_FREE_BP */ 2059 2059 return 10000; 2060 2060 } 2061 + rcu_read_unlock(); 2062 + 2061 2063 mem_cgroup_flush_stats(memcg); 2062 2064 lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(goal->nid)); 2063 2065 used_pages = lruvec_page_state(lruvec, NR_ACTIVE_ANON); 2064 2066 used_pages += lruvec_page_state(lruvec, NR_INACTIVE_ANON); 2065 2067 used_pages += lruvec_page_state(lruvec, NR_ACTIVE_FILE); 2066 2068 used_pages += lruvec_page_state(lruvec, NR_INACTIVE_FILE); 2069 + 2070 + mem_cgroup_put(memcg); 2067 2071 2068 2072 si_meminfo_node(&i, goal->nid); 2069 2073 if (goal->metric == DAMOS_QUOTA_NODE_MEMCG_USED_BP)