<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="caret-color: rgb(0, 0, 0); font-family: &quot;Segoe UI&quot;, &quot;Segoe UI Web (West European)&quot;, &quot;Segoe UI&quot;, -apple-system, BlinkMacSystemFont, Roboto, &quot;Helvetica Neue&quot;, sans-serif; font-size: 14.666666984558105px; background-color: rgb(255, 255, 255); display: inline !important">&gt;Will
 the function work correctly in case jf we completely remove above &quot;if&quot;?&nbsp;</span><span style="caret-color: rgb(0, 0, 0); font-family: &quot;Segoe UI&quot;, &quot;Segoe UI Web (West European)&quot;, &quot;Segoe UI&quot;, -apple-system, BlinkMacSystemFont, Roboto, &quot;Helvetica Neue&quot;, sans-serif; font-size: 14.666666984558105px; background-color: rgb(255, 255, 255); display: inline !important">Is
 this &quot;if&quot; optimization for init_css_set?</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="caret-color: rgb(0, 0, 0); font-family: &quot;Segoe UI&quot;, &quot;Segoe UI Web (West European)&quot;, &quot;Segoe UI&quot;, -apple-system, BlinkMacSystemFont, Roboto, &quot;Helvetica Neue&quot;, sans-serif; font-size: 14.666666984558105px; background-color: rgb(255, 255, 255); display: inline !important"><br>
</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
This is indeed an optimization. And also it looks like it's the most common case.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Kirill Tkhai &lt;ktkhai@virtuozzo.com&gt;<br>
<b>Sent:</b> Friday, April 17, 2020 12:15 PM<br>
<b>To:</b> Valeriy Vdovin &lt;Valeriy.Vdovin@virtuozzo.com&gt;; devel@openvz.org &lt;devel@openvz.org&gt;; Konstantin Khorenko &lt;khorenko@virtuozzo.com&gt;; Pavel Tikhomirov &lt;ptikhomirov@virtuozzo.com&gt;<br>
<b>Subject:</b> Re: [PATCH v10 6/9] ve/cgroup: unmark ve-root cgroups at container stop</font>
<div>&nbsp;</div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">On 16.04.2020 19:14, Valeriy Vdovin wrote:<br>
&gt; Signed-off-by: Valeriy Vdovin &lt;valeriy.vdovin@virtuozzo.com&gt;<br>
&gt; Reviewed-by: Kirill Tkhai &lt;ktkhai@virtuozzo.com&gt;<br>
&gt; ---<br>
&gt;&nbsp; include/linux/cgroup.h |&nbsp; 1 &#43;<br>
&gt;&nbsp; kernel/cgroup.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 42 &#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;<br>
&gt;&nbsp; kernel/ve/ve.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; 2 &#43;&#43;<br>
&gt;&nbsp; 3 files changed, 45 insertions(&#43;)<br>
&gt; <br>
&gt; diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h<br>
&gt; index 0a42f93..1bd0fe7 100644<br>
&gt; --- a/include/linux/cgroup.h<br>
&gt; &#43;&#43;&#43; b/include/linux/cgroup.h<br>
&gt; @@ -636,6 &#43;636,7 @@ int cgroup_task_count(const struct cgroup *cgrp);<br>
&gt;&nbsp; <br>
&gt;&nbsp; #ifdef CONFIG_VE<br>
&gt;&nbsp; void cgroup_mark_ve_roots(struct ve_struct *ve);<br>
&gt; &#43;void cgroup_unmark_ve_roots(struct ve_struct *ve);<br>
&gt;&nbsp; #endif<br>
&gt;&nbsp; <br>
&gt;&nbsp; /*<br>
&gt; diff --git a/kernel/cgroup.c b/kernel/cgroup.c<br>
&gt; index 60a4ca4..1dd36ed 100644<br>
&gt; --- a/kernel/cgroup.c<br>
&gt; &#43;&#43;&#43; b/kernel/cgroup.c<br>
&gt; @@ -635,6 &#43;635,35 @@ static struct css_set *find_css_set(<br>
&gt;&nbsp; }<br>
&gt;&nbsp; <br>
&gt;&nbsp; /*<br>
&gt; &#43; * Walk each cgroup link of a given css_set and find a cgroup that<br>
&gt; &#43; * is the child of cgroupfs_root in argument.<br>
&gt; &#43; */<br>
&gt; &#43;static struct cgroup *css_cgroup_from_root(struct css_set *css_set,<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct cgroupfs_root *root)<br>
&gt; &#43;{<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; struct cgroup *res = NULL;<br>
&gt; &#43;<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; BUG_ON(!mutex_is_locked(&amp;cgroup_mutex));<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; read_lock(&amp;css_set_lock);<br>
&gt; &#43;<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; if (css_set == &amp;init_css_set) {<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res = &amp;root-&gt;top_cgroup;<br>
<br>
Will the function work correctly in case jf we completely remove above &quot;if&quot;?<br>
Is this &quot;if&quot; optimization for init_css_set?<br>
<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct cg_cgroup_link *link;<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list_for_each_entry(link, &amp;css_set-&gt;cg_links, cg_link_list) {<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct cgroup *c = link-&gt;cgrp;<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (c-&gt;root == root) {<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res = c;<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; read_unlock(&amp;css_set_lock);<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; BUG_ON(!res);<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; return res;<br>
&gt; &#43;}<br>
&gt; &#43;<br>
&gt; &#43;/*<br>
&gt;&nbsp;&nbsp; * Return the cgroup for &quot;task&quot; from the given hierarchy. Must be<br>
&gt;&nbsp;&nbsp; * called with cgroup_mutex held.<br>
&gt;&nbsp;&nbsp; */<br>
&gt; @@ -4237,6 &#43;4266,19 @@ void cgroup_mark_ve_roots(struct ve_struct *ve)<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mutex_unlock(&amp;cgroup_mutex);<br>
&gt;&nbsp; }<br>
&gt;&nbsp; <br>
&gt; &#43;void cgroup_unmark_ve_roots(struct ve_struct *ve)<br>
&gt; &#43;{<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; struct cgroup *cgrp;<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; struct cgroupfs_root *root;<br>
&gt; &#43;<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; mutex_lock(&amp;cgroup_mutex);<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; for_each_active_root(root) {<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cgrp = css_cgroup_from_root(ve-&gt;root_css_set, root);<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clear_bit(CGRP_VE_ROOT, &amp;cgrp-&gt;flags);<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; mutex_unlock(&amp;cgroup_mutex);<br>
&gt; &#43;}<br>
&gt; &#43;<br>
&gt;&nbsp; struct cgroup *cgroup_get_ve_root(struct cgroup *cgrp)<br>
&gt;&nbsp; {<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct cgroup *ve_root = NULL;<br>
&gt; diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c<br>
&gt; index eedb85d..db3b600 100644<br>
&gt; --- a/kernel/ve/ve.c<br>
&gt; &#43;&#43;&#43; b/kernel/ve/ve.c<br>
&gt; @@ -618,6 &#43;618,8 @@ void ve_exit_ns(struct pid_namespace *pid_ns)<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!ve-&gt;ve_ns || ve-&gt;ve_ns-&gt;pid_ns != pid_ns)<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>
&gt;&nbsp; <br>
&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; cgroup_unmark_ve_roots(ve);<br>
&gt; &#43;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ve_workqueue_stop(ve);<br>
&gt;&nbsp; <br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>
&gt; <br>
<br>
</div>
</span></font></div>
</body>
</html>