cgroups: don't put struct cgroupfs_root protected by RCU
PATCH 1/1 cgroups: don't put struct cgroupfs_root protected by RCU
we don't access struct cgroupfs_root in fast path, so we should not put struct cgroupfs_root protected by RCU
but the comment in struct cgroup_subsys.root confuse us.
struct cgroup_subsys.root is used in these places:
1 find_css_set(): if (ss->root->subsys_list.next == &ss->sibling) 2 rebind_subsystems(): if (ss->root != &rootnode)
rcu_assign_pointer(ss->root, root);
rcu_assign_pointer(subsys[i]->root, &rootnode);
3 cgroup_has_css_refs(): if (ss->root != cgrp->root)
4 cgroup_init_subsys(): ss->root = &rootnode;
5 proc_cgroupstats_show(): ss->name, ss->root->subsys_bits,
ss->root->number_of_cgroups, !ss->disabled);
6 cgroup_clone(): root = subsys->root;
if ((root != subsys->root) ||all these place we have held cgroup_lock() or we don't dereference to struct cgroupfs_root. It's means wo don't need RCU when use struct cgroup_subsys.root, and we should not put struct cgroupfs_root protected by RCU.
---
include/linux/cgroup.h +0 -1
@@ -343,7 +345,6 @@ struct cgroup_subsys {#define MAX_CGROUP_TYPE_NAMELEN 32const char *name; -/* Protected by RCU */ struct cgroupfs_root *root;struct list_head sibling;
kernel/cgroup.c +2 -2
@@ -717,7 +722,7 @@ static int rebind_subsystems(struct cgroupfs_root *root, cgrp->subsys[i] = dummytop->subsys[i]; cgrp->subsys[i]->cgroup = cgrp;list_add (&ss->sibling, &root->subsys_list); -rcu_assign_pointer (ss->root, root); + ss->root = root;if (ss->bind) ss->bind (ss, cgrp);
@@ -729,7 +734,7 @@ static int rebind_subsystems(struct cgroupfs_root *root, ss->bind (ss, dummytop); dummytop->subsys[i]->cgroup = dummytop; cgrp->subsys[i] =NULL ; -rcu_assign_pointer (subsys[i]->root, &rootnode); + subsys[i]->root = &rootnode;list_del (&ss->sibling); }else if (bit & final_bits) {/* Subsystem state should already exist */
A message that is not in the archive (sent off-list or not yet received): [email protected]
Paul Menage
Reviewed-byQuoted 19 lines · Lai Jiangshan
we don't access struct
cgroupfs_rootin fast path, so we should not put structcgroupfs_rootprotected by RCUbut the comment in struct cgroup_subsys.root confuse us.
struct cgroup_subsys.root is used in these places:
1
find_css_set(): if (ss->root->subsys_list.next==&ss->sibling) 2rebind_subsystems(): if (ss->root!= &rootnode)rcu_assign_pointer(ss->root, root); rcu_assign_pointer(subsys[i]->root, &rootnode); 3 cgroup_has_css_refs(): if (ss->root != cgrp->root) 4 cgroup_init_subsys(): ss->root = &rootnode; 5 proc_cgroupstats_show(): ss->name, ss->root->subsys_bits, ss->root->number_of_cgroups, !ss->disabled); 6 cgroup_clone(): root = subsys->root; if ((root != subsys->root) ||
Quoted 6 lines
all these place we have held
cgroup_lock()or we don't dereference to structcgroupfs_root. It's means wo don't need RCU when use struct cgroup_subsys.root, and we should not put structcgroupfs_rootprotected by RCU.Signed-off-by Lai Jiangshan <[email protected]>
Thanks, seems reasonable.
Quoted 38 lines
---
include/linux/cgroup.h +0
-1@@ -343,7 +345,6 @@ struct cgroup_subsys {#define MAX_CGROUP_TYPE_NAMELEN 32const char *name; -/* Protected by RCU */ struct cgroupfs_root *root;struct list_head sibling;kernel/cgroup.c +2
-2@@ -717,7 +722,7 @@ static int rebind_subsystems(struct cgroupfs_root *root, cgrp->subsys[i] = dummytop->subsys[i]; cgrp->subsys[i]->cgroup = cgrp;list_add (&ss->sibling, &root->subsys_list); -rcu_assign_pointer (ss->root, root); + ss->root = root;if (ss->bind) ss->bind (ss, cgrp);@@ -729,7 +734,7 @@ static int rebind_subsystems(struct cgroupfs_root *root, ss->bind (ss, dummytop); dummytop->subsys[i]->cgroup = dummytop; cgrp->subsys[i] =NULL ; -rcu_assign_pointer (subsys[i]->root, &rootnode); + subsys[i]->root = &rootnode;list_del (&ss->sibling); }else if (bit & final_bits) {/* Subsystem state should already exist */
Quoted 19 lines · Lai Jiangshan
we don't access struct
cgroupfs_rootin fast path, so we should not put structcgroupfs_rootprotected by RCUbut the comment in struct cgroup_subsys.root confuse us.
struct cgroup_subsys.root is used in these places:
1
find_css_set(): if (ss->root->subsys_list.next==&ss->sibling) 2rebind_subsystems(): if (ss->root!= &rootnode)rcu_assign_pointer(ss->root, root); rcu_assign_pointer(subsys[i]->root, &rootnode); 3 cgroup_has_css_refs(): if (ss->root != cgrp->root) 4 cgroup_init_subsys(): ss->root = &rootnode; 5 proc_cgroupstats_show(): ss->name, ss->root->subsys_bits, ss->root->number_of_cgroups, !ss->disabled); 6 cgroup_clone(): root = subsys->root; if ((root != subsys->root) ||
Quoted 6 lines
all these place we have held
cgroup_lock()or we don't dereference to structcgroupfs_root. It's means wo don't need RCU when use struct cgroup_subsys.root, and we should not put structcgroupfs_rootprotected by RCU.Signed-off-by Lai Jiangshan <[email protected]>
Thanks, seems reasonable.
Quoted 38 lines
---
include/linux/cgroup.h +0
-1@@ -343,7 +345,6 @@ struct cgroup_subsys {#define MAX_CGROUP_TYPE_NAMELEN 32const char *name; -/* Protected by RCU */ struct cgroupfs_root *root;struct list_head sibling;kernel/cgroup.c +2
-2@@ -717,7 +722,7 @@ static int rebind_subsystems(struct cgroupfs_root *root, cgrp->subsys[i] = dummytop->subsys[i]; cgrp->subsys[i]->cgroup = cgrp;list_add (&ss->sibling, &root->subsys_list); -rcu_assign_pointer (ss->root, root); + ss->root = root;if (ss->bind) ss->bind (ss, cgrp);@@ -729,7 +734,7 @@ static int rebind_subsystems(struct cgroupfs_root *root, ss->bind (ss, dummytop); dummytop->subsys[i]->cgroup = dummytop; cgrp->subsys[i] =NULL ; -rcu_assign_pointer (subsys[i]->root, &rootnode); + subsys[i]->root = &rootnode;list_del (&ss->sibling); }else if (bit & final_bits) {/* Subsystem state should already exist */