On Mon 06-03-23 23:41:36, Yue Zhao wrote: > The knob for cgroup v1 memory controller: memory.swappiness > 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->swappiness and vm_swappiness is lockless, > so both of them can be concurrently set at the same time > as we are trying to read them. > > Signed-off-by: Yue Zhao <findns94@xxxxxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxxx> Thanks! > --- > include/linux/swap.h | 8 ++++---- > mm/memcontrol.c | 4 ++-- > 2 files changed, 6 insertions(+), 6 deletions(-) > > diff --git a/include/linux/swap.h b/include/linux/swap.h > index 209a425739a9..3f3fe43d1766 100644 > --- a/include/linux/swap.h > +++ b/include/linux/swap.h > @@ -620,18 +620,18 @@ static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg) > { > /* Cgroup2 doesn't have per-cgroup swappiness */ > if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) > - return vm_swappiness; > + return READ_ONCE(vm_swappiness); > > /* root ? */ > if (mem_cgroup_disabled() || mem_cgroup_is_root(memcg)) > - return vm_swappiness; > + return READ_ONCE(vm_swappiness); > > - return memcg->swappiness; > + return READ_ONCE(memcg->swappiness); > } > #else > static inline int mem_cgroup_swappiness(struct mem_cgroup *mem) > { > - return vm_swappiness; > + return READ_ONCE(vm_swappiness); > } > #endif > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 06821e5f7604..dca895c66a9b 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -4179,9 +4179,9 @@ static int mem_cgroup_swappiness_write(struct cgroup_subsys_state *css, > return -EINVAL; > > if (!mem_cgroup_is_root(memcg)) > - memcg->swappiness = val; > + WRITE_ONCE(memcg->swappiness, val); > else > - vm_swappiness = val; > + WRITE_ONCE(vm_swappiness, val); > > return 0; > } > -- > 2.17.1 -- Michal Hocko SUSE Labs