• T
    cpuset: replace cgroup_mutex locking with cpuset internal locking · 5d21cc2d
    Tejun Heo 提交于
    Supposedly for historical reasons, cpuset depends on cgroup core for
    locking.  It depends on cgroup_mutex in cgroup callbacks and grabs
    cgroup_mutex from other places where it wants to be synchronized.
    This is majorly messy and highly prone to introducing circular locking
    dependency especially because cgroup_mutex is supposed to be one of
    the outermost locks.
    
    As previous patches already plugged possible races which may happen by
    decoupling from cgroup_mutex, replacing cgroup_mutex with cpuset
    specific cpuset_mutex is mostly straight-forward.  Introduce
    cpuset_mutex, replace all occurrences of cgroup_mutex with it, and add
    cpuset_mutex locking to places which inherited cgroup_mutex from
    cgroup core.
    
    The only complication is from cpuset wanting to initiate task
    migration when a cpuset loses all cpus or memory nodes.  Task
    migration may go through full cgroup and all subsystem locking and
    should be initiated without holding any cpuset specific lock; however,
    a previous patch already made hotplug handled asynchronously and
    moving the task migration part outside other locks is easy.
    cpuset_propagate_hotplug_workfn() now invokes
    remove_tasks_in_empty_cpuset() without holding any lock.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Acked-by: NLi Zefan <lizefan@huawei.com>
    5d21cc2d
cpuset.c 77.1 KB