• Li Zefan's avatar
    sched: split out css_online/css_offline from tg creation/destruction · ace783b9
    Li Zefan authored
    This is a preparaton for later patches.
    
    - What do we gain from cpu_cgroup_css_online():
    
    After ss->css_alloc() and before ss->css_online(), there's a small
    window that tg->css.cgroup is NULL. With this change, tg won't be seen
    before ss->css_online(), where it's added to the global list, so we're
    guaranteed we'll never see NULL tg->css.cgroup.
    
    - What do we gain from cpu_cgroup_css_offline():
    
    tg is freed via RCU, so is cgroup. Without this change, This is how
    synchronization works:
    
    cgroup_rmdir()
      no ss->css_offline()
    diput()
      syncornize_rcu()
      ss->css_free()       <-- unregister tg, and free it via call_rcu()
      kfree_rcu(cgroup)    <-- wait possible refs to cgroup, and free cgroup
    
    We can't just kfree(cgroup), because tg might access tg->css.cgroup.
    
    With this change:
    
    cgroup_rmdir()
      ss->css_offline()    <-- unregister tg
    diput()
      synchronize_rcu()    <-- wait possible refs to tg and cgroup
      ss->css_free()       <-- free tg
      kfree_rcu(cgroup)    <-- free cgroup
    
    As you see, kfree_rcu() is redundant now.
    Signed-off-by: default avatarLi Zefan <lizefan@huawei.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarIngo Molnar <mingo@kernel.org>
    ace783b9
core.c 196 KB