• T
    cgroup: implement dynamic subtree controller enable/disable on the default hierarchy · f8f22e53
    Tejun Heo 提交于
    cgroup is switching away from multiple hierarchies and will use one
    unified default hierarchy where controllers can be dynamically enabled
    and disabled per subtree.  The default hierarchy will serve as the
    unified hierarchy to which all controllers are attached and a css on
    the default hierarchy would need to also serve the tasks of descendant
    cgroups which don't have the controller enabled - ie. the tree may be
    collapsed from leaf towards root when viewed from specific
    controllers.  This has been implemented through effective css in the
    previous patches.
    
    This patch finally implements dynamic subtree controller
    enable/disable on the default hierarchy via a new knob -
    "cgroup.subtree_control" which controls which controllers are enabled
    on the child cgroups.  Let's assume a hierarchy like the following.
    
      root - A - B - C
                   \ D
    
    root's "cgroup.subtree_control" determines which controllers are
    enabled on A.  A's on B.  B's on C and D.  This coincides with the
    fact that controllers on the immediate sub-level are used to
    distribute the resources of the parent.  In fact, it's natural to
    assume that resource control knobs of a child belong to its parent.
    Enabling a controller in "cgroup.subtree_control" declares that
    distribution of the respective resources of the cgroup will be
    controlled.  Note that this means that controller enable states are
    shared among siblings.
    
    The default hierarchy has an extra restriction - only cgroups which
    don't contain any task may have controllers enabled in
    "cgroup.subtree_control".  Combined with the other properties of the
    default hierarchy, this guarantees that, from the view point of
    controllers, tasks are only on the leaf cgroups.  In other words, only
    leaf csses may contain tasks.  This rules out situations where child
    cgroups compete against internal tasks of the parent, which is a
    competition between two different types of entities without any clear
    way to determine resource distribution between the two.  Different
    controllers handle it differently and all the implemented behaviors
    are ambiguous, ad-hoc, cumbersome and/or just wrong.  Having this
    structural constraints imposed from cgroup core removes the burden
    from controller implementations and enables showing one consistent
    behavior across all controllers.
    
    When a controller is enabled or disabled, css associations for the
    controller in the subtrees of each child should be updated.  After
    enabling, the whole subtree of a child should point to the new css of
    the child.  After disabling, the whole subtree of a child should point
    to the cgroup's css.  This is implemented by first updating cgroup
    states such that cgroup_e_css() result points to the appropriate css
    and then invoking cgroup_update_dfl_csses() which migrates all tasks
    in the affected subtrees to the self cgroup on the default hierarchy.
    
    * When read, "cgroup.subtree_control" lists all the currently enabled
      controllers on the children of the cgroup.
    
    * White-space separated list of controller names prefixed with either
      '+' or '-' can be written to "cgroup.subtree_control".  The ones
      prefixed with '+' are enabled on the controller and '-' disabled.
    
    * A controller can be enabled iff the parent's
      "cgroup.subtree_control" enables it and disabled iff no child's
      "cgroup.subtree_control" has it enabled.
    
    * If a cgroup has tasks, no controller can be enabled via
      "cgroup.subtree_control".  Likewise, if "cgroup.subtree_control" has
      some controllers enabled, tasks can't be migrated into the cgroup.
    
    * All controllers which aren't bound on other hierarchies are
      automatically associated with the root cgroup of the default
      hierarchy.  All the controllers which are bound to the default
      hierarchy are listed in the read-only file "cgroup.controllers" in
      the root directory.
    
    * "cgroup.controllers" in all non-root cgroups is read-only file whose
      content is equal to that of "cgroup.subtree_control" of the parent.
      This indicates which controllers can be used in the cgroup's
      "cgroup.subtree_control".
    
    This is still experimental and there are some holes, one of which is
    that ->can_attach() failure during cgroup_update_dfl_csses() may leave
    the cgroups in an undefined state.  The issues will be addressed by
    future patches.
    
    v2: Non-root cgroups now also have "cgroup.controllers".
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Acked-by: NLi Zefan <lizefan@huawei.com>
    f8f22e53
cgroup.h 27.0 KB