• Tejun Heo's avatar
    cgroup: skip refcnting on normal root csses and cgrp_dfl_root self css · 3b514d24
    Tejun Heo authored
    9395a450 ("cgroup: enable refcnting for root csses") enabled
    reference counting for root csses (cgroup_subsys_states) so that
    cgroup's self csses can be used to manage the lifetime of the
    containing cgroups.
    
    Unfortunately, this change was incorrect.  During early init,
    cgrp_dfl_root self css refcnt is used.  percpu_ref can't initialized
    during early init and its initialization is deferred till
    cgroup_init() time.  This means that cpu was using percpu_ref which
    wasn't properly initialized.  Due to the way percpu variables are laid
    out on x86, this didn't blow up immediately on x86 but ended up
    incrementing and decrementing the percpu variable at offset zero,
    whatever it may be; however, on other archs, this caused fault and
    early boot failure.
    
    As cgroup self csses for root cgroups of non-dfl hierarchies need
    working refcounting, we can't revert 9395a450.  This patch adds
    CSS_NO_REF which explicitly inhibits reference counting on the css and
    sets it on all normal (non-self) csses and cgroup_dfl_root self css.
    
    v2: cgrp_dfl_root.self is the offending one.  Set the flag on it.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarStephen Warren <swarren@nvidia.com>
    Tested-by: default avatarStephen Warren <swarren@nvidia.com>
    Fixes: 9395a450 ("cgroup: enable refcnting for root csses")
    3b514d24
cgroup.c 142 KB