On 17.04.2020 15:11, Valeriy Vdovin wrote: >>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.
(Please, avoid top-posting in your replies. Top-posting is not welcomed. See in Documentation/development-process/2.Process) Then, we should add a comment about that this is optimization, I think. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ > *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
