• Tejun Heo's avatar
    cgroup: fix the async css offline wait logic in cgroup_subtree_control_write() · db6e3053
    Tejun Heo authored
    When a subsystem is offlined, its entry on @cgrp->subsys[] is cleared
    asynchronously.  If cgroup_subtree_control_write() is requested to
    enable the subsystem again before the entry is cleared, it has to wait
    for the previous offlining to finish and clear the @cgrp->subsys[]
    entry before trying to enable the subsystem again.
    
    This is currently done while verifying the input enable / disable
    parameters.  This used to be correct but f63070d3 ("cgroup: make
    interface files visible iff enabled on cgroup->subtree_control")
    breaks it.  The commit is one of the commits implementing subsystem
    dependency.
    
    Through subsystem dependency, some subsystems may be enabled and
    disabled implicitly in addition to the explicitly requested ones.  The
    actual subsystems to be enabled and disabled are determined during
    @css_enable/disable calculation.  The current offline wait logic skips
    the ones which are already implicitly enabled and then waits for
    subsystems in @enable; however, this misses the subsystems which may
    be implicitly enabled through dependency from @enable.  If such
    implicitly subsystem hasn't yet finished offlining yet, the function
    ends up trying to create a css when its @cgrp->subsys[] slot is
    already occupied triggering BUG_ON() in init_and_link_css().
    
    Fix it by moving the wait logic after @css_enable is calculated and
    waiting for all the subsystems in @css_enable.  This fixes the above
    bug as the mask contains all subsystems which are to be enabled
    including the ones enabled through dependencies.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Fixes: f63070d3 ("cgroup: make interface files visible iff enabled on cgroup->subtree_control")
    Acked-by: default avatarZefan Li <lizefan@huawei.com>
    db6e3053
cgroup.c 148 KB