Hello, On Mon, Dec 13, 2021 at 11:05:06PM +0800, Honglei Wang wrote: > +#ifdef CONFIG_NUMA_BALANCING > +static void __cgroup_numabalancing_disable_set(struct cgroup *cgrp, bool nb_disable) > +{ > + struct css_task_iter it; > + struct task_struct *task; > + > + lockdep_assert_held(&cgroup_mutex); > + > + spin_lock_irq(&css_set_lock); > + if (nb_disable) > + set_bit(CGRP_NUMABALANCING_DISABLE, &cgrp->flags); > + else > + clear_bit(CGRP_NUMABALANCING_DISABLE, &cgrp->flags); > + spin_unlock_irq(&css_set_lock); > + > + css_task_iter_start(&cgrp->self, 0, &it); > + while ((task = css_task_iter_next(&it))) { > + /* > + * We don't care about NUMA placement if the task is exiting. > + * And we don't NUMA balance for kthreads. > + */ > + if (task->flags & (PF_EXITING | PF_KTHREAD)) > + continue; > + task->numa_cgrp_disable = nb_disable; > + } > + css_task_iter_end(&it); > +} All it's doing is setting some property recursively and I don't think it makes sense to keep expanding cgroup interface for this sort of usage. It's not distributing any resource in hierarchical way and the whole feature can be replaced by inheritable per-process interface with some scripting. Unless there are some other compelling reasons, this is gonna be a strong nack from cgroup side. Thanks. -- tejun