• J
    cgroup: rstat: punt root-level optimization to individual controllers · dc26532a
    Johannes Weiner 提交于
    Current users of the rstat code can source root-level statistics from
    the native counters of their respective subsystem, allowing them to
    forego aggregation at the root level.  This optimization is currently
    implemented inside the generic rstat code, which doesn't track the root
    cgroup and doesn't invoke the subsystem flush callbacks on it.
    
    However, the memory controller cannot do this optimization, because
    cgroup1 breaks out memory specifically for the local level, including at
    the root level.  In preparation for the memory controller switching to
    rstat, move the optimization from rstat core to the controllers.
    
    Afterwards, rstat will always track the root cgroup for changes and
    invoke the subsystem callbacks on it; and it's up to the subsystem to
    special-case and skip aggregation of the root cgroup if it can source
    this information through other, cheaper means.
    
    This is the case for the io controller and the cgroup base stats.  In
    their respective flush callbacks, check whether the parent is the root
    cgroup, and if so, skip the unnecessary upward propagation.
    
    The extra cost of tracking the root cgroup is negligible: on stat
    changes, we actually remove a branch that checks for the root.  The
    queueing for a flush touches only per-cpu data, and only the first stat
    change since a flush requires a (per-cpu) lock.
    
    Link: https://lkml.kernel.org/r/20210209163304.77088-6-hannes@cmpxchg.orgSigned-off-by: NJohannes Weiner <hannes@cmpxchg.org>
    Acked-by: NTejun Heo <tj@kernel.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Michal Koutný <mkoutny@suse.com>
    Cc: Roman Gushchin <guro@fb.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    dc26532a
blk-cgroup.c 50.4 KB