• Tejun Heo's avatar
    cgroup: use cgroup->self.refcnt for cgroup refcnting · 9d755d33
    Tejun Heo authored
    Currently cgroup implements refcnting separately using atomic_t
    cgroup->refcnt.  The destruction paths of cgroup and css are rather
    complex and bear a lot of similiarities including the use of RCU and
    bouncing to a work item.
    
    This patch makes cgroup use the refcnt of self css for refcnting
    instead of using its own.  This makes cgroup refcnting use css's
    percpu refcnt and share the destruction mechanism.
    
    * css_release_work_fn() and css_free_work_fn() are updated to handle
      both csses and cgroups.  This is a bit messy but should do until we
      can make cgroup->self a full css, which currently can't be done
      thanks to multiple hierarchies.
    
    * cgroup_destroy_locked() now performs
      percpu_ref_kill(&cgrp->self.refcnt) instead of cgroup_put(cgrp).
    
    * Negative refcnt sanity check in cgroup_get() is no longer necessary
      as percpu_ref already handles it.
    
    * Similarly, as a cgroup which hasn't been killed will never be
      released regardless of its refcnt value and percpu_ref has sanity
      check on kill, cgroup_is_dead() sanity check in cgroup_put() is no
      longer necessary.
    
    * As whether a refcnt reached zero or not can only be decided after
      the reference count is killed, cgroup_root->cgrp's refcnting can no
      longer be used to decide whether to kill the root or not.  Let's
      make cgroup_kill_sb() explicitly initiate destruction if the root
      doesn't have any children.  This makes sense anyway as unmounted
      cgroup hierarchy without any children should be destroyed.
    
    While this is a bit messy, this will allow pushing more bookkeeping
    towards cgroup->self and thus handling cgroups and csses in more
    uniform way.  In the very long term, it should be possible to
    introduce a base subsystem and convert the self css to a proper one
    making things whole lot simpler and unified.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarLi Zefan <lizefan@huawei.com>
    9d755d33
cgroup.c 141 KB