On Tue 03-08-21 14:29:13, Miaohe Lin wrote: [...] > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 616d1a72ece3..6210b1124929 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -2208,11 +2208,11 @@ static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages) > */ > static void drain_all_stock(struct mem_cgroup *root_memcg) > { > - static DEFINE_MUTEX(percpu_charge_mutex); > int cpu, curcpu; > + static atomic_t drainer = ATOMIC_INIT(0); > > /* If someone's already draining, avoid adding running more workers. */ > - if (!mutex_trylock(&percpu_charge_mutex)) > + if (atomic_cmpxchg(&drainer, 0, 1) != 0) > return; > /* > * Notify other cpus that system-wide "drain" is running > @@ -2244,7 +2244,7 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) > } > } > put_cpu(); > - mutex_unlock(&percpu_charge_mutex); > + atomic_set(&drainer, 0); atomic_set doesn't imply memory barrier IIRC. Is this safe? -- Michal Hocko SUSE Labs