On Tue, Mar 7, 2023 at 1:53 AM Michal Hocko <mhocko@xxxxxxxx> wrote: > > On Mon 06-03-23 23:41:37, Yue Zhao wrote: > > The knob for cgroup v1 memory controller: memory.oom_control > > is not protected by any locking so it can be modified while it is used. > > This is not an actual problem because races are unlikely. > > But it is better to use READ_ONCE/WRITE_ONCE to prevent compiler from > > doing anything funky. > > > > The access of memcg->oom_kill_disable is lockless, > > so it can be concurrently set at the same time as we are > > trying to read it. > > > > Signed-off-by: Yue Zhao <findns94@xxxxxxxxx> > > --- > > mm/memcontrol.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > > index dca895c66a9b..26605b2f51b1 100644 > > --- a/mm/memcontrol.c > > +++ b/mm/memcontrol.c > > @@ -4515,7 +4515,7 @@ static int mem_cgroup_oom_control_read(struct seq_file *sf, void *v) > > { > > struct mem_cgroup *memcg = mem_cgroup_from_seq(sf); > > > > - seq_printf(sf, "oom_kill_disable %d\n", memcg->oom_kill_disable); > > + seq_printf(sf, "oom_kill_disable %d\n", READ_ONCE(memcg->oom_kill_disable)); > > seq_printf(sf, "under_oom %d\n", (bool)memcg->under_oom); > > seq_printf(sf, "oom_kill %lu\n", > > atomic_long_read(&memcg->memory_events[MEMCG_OOM_KILL])); > > @@ -4531,7 +4531,7 @@ static int mem_cgroup_oom_control_write(struct cgroup_subsys_state *css, > > if (mem_cgroup_is_root(memcg) || !((val == 0) || (val == 1))) > > return -EINVAL; > > > > - memcg->oom_kill_disable = val; > > + WRITE_ONCE(memcg->oom_kill_disable, val); > > if (!val) > > memcg_oom_recover(memcg); > > Any specific reasons you haven't covered other accesses > (mem_cgroup_css_alloc, mem_cgroup_oom, mem_cgroup_oom_synchronize)? Thanks for point this out, you are right, we should add [READ|WRITE]_ONCE for all used places. Let me create PATCH v3 later. Also for the memcg->soft_limit, I will update as well. > > > > -- > > 2.17.1 > > -- > Michal Hocko > SUSE Labs