• T
    cpuset: make CPU / memory hotplug propagation asynchronous · 8d033948
    Tejun Heo 提交于
    cpuset_hotplug_workfn() has been invoking cpuset_propagate_hotplug()
    directly to propagate hotplug updates to !root cpusets; however, this
    has the following problems.
    
    * cpuset locking is scheduled to be decoupled from cgroup_mutex,
      cgroup_mutex will be unexported, and cgroup_attach_task() will do
      cgroup locking internally, so propagation can't synchronously move
      tasks to a parent cgroup while walking the hierarchy.
    
    * We can't use cgroup generic tree iterator because propagation to
      each cpuset may sleep.  With propagation done asynchronously, we can
      lose the rather ugly cpuset specific iteration.
    
    Convert cpuset_propagate_hotplug() to
    cpuset_propagate_hotplug_workfn() and execute it from newly added
    cpuset->hotplug_work.  The work items are run on an ordered workqueue,
    so the propagation order is preserved.  cpuset_hotplug_workfn()
    schedules all propagations while holding cgroup_mutex and waits for
    completion without cgroup_mutex.  Each in-flight propagation holds a
    reference to the cpuset->css.
    
    This patch doesn't cause any functional difference.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Acked-by: NLi Zefan <lizefan@huawei.com>
    8d033948
cpuset.c 75.3 KB