• Tejun Heo's avatar
    cgroup: introduce cgroup_tree_mutex · ace2bee8
    Tejun Heo authored
    Currently cgroup uses combination of inode->i_mutex'es and
    cgroup_mutex for synchronization.  With the scheduled kernfs
    conversion, i_mutex'es will be removed.  Unfortunately, just using
    cgroup_mutex isn't possible.  All kernfs file and syscall operations,
    most of which require grabbing cgroup_mutex, will be called with
    kernfs active ref held and, if we try to perform kernfs removals under
    cgroup_mutex, it can deadlock as kernfs_remove() tries to drain the
    target node.
    
    Let's introduce a new outer mutex, cgroup_tree_mutex, which protects
    stuff used during hierarchy changing operations - cftypes and all the
    operations which may affect the cgroupfs.  It also covers css
    association and iteration.  This allows cgroup_css(), for_each_css()
    and other css iterators to be called under cgroup_tree_mutex.  The new
    mutex will nest above both kernfs's active ref protection and
    cgroup_mutex.  By protecting tree modifications with a separate outer
    mutex, we can get rid of the forementioned deadlock condition.
    
    Actual file additions and removals now require cgroup_tree_mutex
    instead of cgroup_mutex.  Currently, cgroup_tree_mutex is never used
    without cgroup_mutex; however, we'll soon add hierarchy modification
    sections which are only protected by cgroup_tree_mutex.  In the
    future, we might want to make the locking more granular by better
    splitting the coverages of the two mutexes.  For now, this should do.
    
    v2: Rebased on top of 0ab02ca8 ("cgroup: protect modifications to
        cgroup_idr with cgroup_mutex").
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarLi Zefan <lizefan@huawei.com>
    ace2bee8
cgroup.c 141 KB