>Will the function work correctly in case jf we completely remove above "if"? >Is this "if" optimization for init_css_set?
This is indeed an optimization. And also it looks like it's the most common case. ________________________________ From: Kirill Tkhai <[email protected]> Sent: Friday, April 17, 2020 12:15 PM To: Valeriy Vdovin <[email protected]>; [email protected] <[email protected]>; Konstantin Khorenko <[email protected]>; Pavel Tikhomirov <[email protected]> Subject: Re: [PATCH v10 6/9] ve/cgroup: unmark ve-root cgroups at container stop On 16.04.2020 19:14, Valeriy Vdovin wrote: > Signed-off-by: Valeriy Vdovin <[email protected]> > Reviewed-by: Kirill Tkhai <[email protected]> > --- > include/linux/cgroup.h | 1 + > kernel/cgroup.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > kernel/ve/ve.c | 2 ++ > 3 files changed, 45 insertions(+) > > diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h > index 0a42f93..1bd0fe7 100644 > --- a/include/linux/cgroup.h > +++ b/include/linux/cgroup.h > @@ -636,6 +636,7 @@ int cgroup_task_count(const struct cgroup *cgrp); > > #ifdef CONFIG_VE > void cgroup_mark_ve_roots(struct ve_struct *ve); > +void cgroup_unmark_ve_roots(struct ve_struct *ve); > #endif > > /* > diff --git a/kernel/cgroup.c b/kernel/cgroup.c > index 60a4ca4..1dd36ed 100644 > --- a/kernel/cgroup.c > +++ b/kernel/cgroup.c > @@ -635,6 +635,35 @@ static struct css_set *find_css_set( > } > > /* > + * Walk each cgroup link of a given css_set and find a cgroup that > + * is the child of cgroupfs_root in argument. > + */ > +static struct cgroup *css_cgroup_from_root(struct css_set *css_set, > + struct cgroupfs_root *root) > +{ > + struct cgroup *res = NULL; > + > + BUG_ON(!mutex_is_locked(&cgroup_mutex)); > + read_lock(&css_set_lock); > + > + if (css_set == &init_css_set) { > + res = &root->top_cgroup; Will the function work correctly in case jf we completely remove above "if"? Is this "if" optimization for init_css_set? > + } else { > + struct cg_cgroup_link *link; > + list_for_each_entry(link, &css_set->cg_links, cg_link_list) { > + struct cgroup *c = link->cgrp; > + if (c->root == root) { > + res = c; > + break; > + } > + } > + } > + read_unlock(&css_set_lock); > + BUG_ON(!res); > + return res; > +} > + > +/* > * Return the cgroup for "task" from the given hierarchy. Must be > * called with cgroup_mutex held. > */ > @@ -4237,6 +4266,19 @@ void cgroup_mark_ve_roots(struct ve_struct *ve) > mutex_unlock(&cgroup_mutex); > } > > +void cgroup_unmark_ve_roots(struct ve_struct *ve) > +{ > + struct cgroup *cgrp; > + struct cgroupfs_root *root; > + > + mutex_lock(&cgroup_mutex); > + for_each_active_root(root) { > + cgrp = css_cgroup_from_root(ve->root_css_set, root); > + clear_bit(CGRP_VE_ROOT, &cgrp->flags); > + } > + mutex_unlock(&cgroup_mutex); > +} > + > struct cgroup *cgroup_get_ve_root(struct cgroup *cgrp) > { > struct cgroup *ve_root = NULL; > diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c > index eedb85d..db3b600 100644 > --- a/kernel/ve/ve.c > +++ b/kernel/ve/ve.c > @@ -618,6 +618,8 @@ void ve_exit_ns(struct pid_namespace *pid_ns) > if (!ve->ve_ns || ve->ve_ns->pid_ns != pid_ns) > return; > > + cgroup_unmark_ve_roots(ve); > + > ve_workqueue_stop(ve); > > /* >
_______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
