• Tejun Heo's avatar
    cgroup: cgroup->dentry isn't a RCU pointer · febfcef6
    Tejun Heo authored
    cgroup->dentry is marked and used as a RCU pointer; however, it isn't
    one - the final dentry put doesn't go through call_rcu().  cgroup and
    dentry share the same RCU freeing rule via synchronize_rcu() in
    cgroup_diput() (kfree_rcu() used on cgrp is unnecessary).  If cgrp is
    accessible under RCU read lock, so is its dentry and dereferencing
    cgrp->dentry doesn't need any further RCU protection or annotation.
    
    While not being accurate, before the previous patch, the RCU accessors
    served a purpose as memory barriers - cgroup->dentry used to be
    assigned after the cgroup was made visible to cgroup_path(), so the
    assignment and dereferencing in cgroup_path() needed the memory
    barrier pair.  Now that list_add_tail_rcu() happens after
    cgroup->dentry is assigned, this no longer is necessary.
    
    Remove the now unnecessary and misleading RCU annotations from
    cgroup->dentry.  To make up for the removal of rcu_dereference_check()
    in cgroup_path(), add an explicit rcu_lockdep_assert(), which asserts
    the dereference rule of @cgrp, not cgrp->dentry.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarLi Zefan <lizefan@huawei.com>
    febfcef6
cgroup.c 145 KB