On Fri, Jun 28, 2019 at 10:06:15AM +0200, Juri Lelli wrote: > @@ -2154,7 +2154,7 @@ static int cpuset_can_attach(struct cgroup_taskset *tset) > cpuset_attach_old_cs = task_cs(cgroup_taskset_first(tset, &css)); > cs = css_cs(css); > > - mutex_lock(&cpuset_mutex); > + percpu_down_read(&cpuset_rwsem); > > /* allow moving tasks into an empty cpuset if on default hierarchy */ > ret = -ENOSPC; > @@ -2178,7 +2178,7 @@ static int cpuset_can_attach(struct cgroup_taskset *tset) > cs->attach_in_progress++; > ret = 0; > out_unlock: > - mutex_unlock(&cpuset_mutex); > + percpu_up_read(&cpuset_rwsem); > return ret; > } > > @@ -2188,9 +2188,9 @@ static void cpuset_cancel_attach(struct cgroup_taskset *tset) > > cgroup_taskset_first(tset, &css); > > - mutex_lock(&cpuset_mutex); > + percpu_down_read(&cpuset_rwsem); > css_cs(css)->attach_in_progress--; > - mutex_unlock(&cpuset_mutex); > + percpu_up_read(&cpuset_rwsem); > } These are the only percpu_down_read()s introduced in this patch; are we sure this is correct? Specifically, what serializes ->attach_in_progress?