<div dir="ltr"><div><span style="font-family:arial,sans-serif;font-size:13px">Pavel,</span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">Just a quick follow up:</span></div>
<span style="font-family:arial,sans-serif;font-size:13px"><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div>&gt; 1. cgroups sub-hierarchy</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">&gt; 2. configuration of cgroups</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">&gt; 3. populating cgroups with tasks</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">&gt; 4. creating cgroup mountpoints (if any)</span><br><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">Pertaining to the list above, one of our interns is working on #2 and will probably have a patch in a month.  Please let me know if someone is already working on this to avoid duplication of effort.</span><br>
</div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><div style="font-family:arial,sans-serif;font-size:13px">&gt; With a CLI option we tell CRIU:</div><div style="font-family:arial,sans-serif;font-size:13px">
&gt;</div><div style="font-family:arial,sans-serif;font-size:13px">&gt; 1. Expect the cgroup to already exist, just put the process back in it.  If cgroup doesn&#39;t exist, fail.</div><div style="font-family:arial,sans-serif;font-size:13px">
&gt; 2. Expect the cgroup not to exist, create it and put the process in it.  If cgroup exists, fail.</div></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><font face="arial, sans-serif">I was wondering if you had a chance to think about this.  As explained before, there are legitimate cases where the cgroups do already exist prior to criu restore, so their absence is a definite error.  Also, there are legitimate cases where the cgroups do not already exist prior to criu restore, so CRIU should create them.  CRIU on its own cannot determine which scenario it&#39;s dealing with.  We can make the default action to always create cgroups, but we still need a mechanism to tell it otherwise.</font></div>
<div><br></div><div><font face="arial, sans-serif">--Saied</font></div><div><font face="arial, sans-serif"><br></font></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 25, 2014 at 10:11 AM, Pavel Emelyanov <span dir="ltr">&lt;<a href="mailto:xemul@parallels.com" target="_blank">xemul@parallels.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 06/25/2014 08:36 PM, Serge Hallyn wrote:<br>
&gt; Quoting Pavel Emelyanov (<a href="mailto:xemul@parallels.com">xemul@parallels.com</a>):<br>
&gt;&gt; On 06/25/2014 07:55 PM, Serge Hallyn wrote:<br>
&gt;&gt;&gt; Quoting Pavel Emelyanov (<a href="mailto:xemul@parallels.com">xemul@parallels.com</a>):<br>
&gt;&gt;&gt;&gt; On 06/25/2014 07:06 PM, Serge Hallyn wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Another complication, btw, will be to do with relative cgroup paths.  I can<br>
&gt;&gt;&gt;&gt;&gt; probably abstract that behind the cgmanager abstraction when I add that,<br>
&gt;&gt;&gt;&gt;&gt; but idea is - if I checkpointed u1 on the host, in /cpuset/lxc/u1, and now<br>
&gt;&gt;&gt;&gt;&gt; restart it inside a nested container, then it should be restarted at<br>
&gt;&gt;&gt;&gt;&gt; /cpuset/lxc/somecontainer/lxc/u1, perhaps even /cpuset/lxc/u1/lxc/u1.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; How about do it two-step.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; First, on dump all cgroup paths are dumped relative to root task groups.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; What do you mean by &#39;root task groups&#39;.<br>
&gt;&gt;<br>
&gt;&gt; The paths to cgroups where the init task lives. In criu code this<br>
&gt;&gt; task is referenced by root_task variable, so we call it root always :)<br>
&gt;&gt;<br>
&gt;&gt;&gt; I would suggest:  For each task, dump the cgroup path relative to the<br>
&gt;&gt;&gt; init task being dumped.<br>
&gt;&gt;<br>
&gt;&gt; +1, this is what I&#39;m suggesting. But this would be tightly affected by<br>
&gt;&gt; the hierarchy dump. The thing is -- in task image (the core.proto one)<br>
&gt;&gt; we don&#39;t keep paths. We keep the cg_set identifier, which refers to the<br>
&gt;&gt; set of cgroups from cgroup image, which in turn contain paths.<br>
&gt;&gt;<br>
&gt;&gt;&gt; For the cgroup hierarchy, dump the path up to the dumping task&#39;s init&#39;s<br>
&gt;&gt;&gt; cgroups.<br>
&gt;&gt;<br>
&gt;&gt; Exactly.<br>
&gt;&gt;<br>
&gt;&gt;&gt; Then at restore, simply restore relative to the restoring path&#39;s init&#39;s<br>
&gt;&gt;&gt; cgroups.<br>
&gt;&gt;<br>
&gt;&gt; Em... Not clear what you mean here. Let&#39;s imagine criu lives in / cgroups<br>
&gt;<br>
&gt; If I&#39;m pid 2048 and call criu to restore a task, criu looks at my init&#39;s<br>
&gt; cgroups (pid 1&#39;s cgroups) and restores relative to that.<br>
&gt;<br>
&gt;&gt; always. The container you dump lives in e.g. /cpuset/lxc/ct1/ one. On<br>
&gt;&gt; restore you want to move it into /cpuset/foo/lxc/ct1/ one.<br>
&gt;<br>
&gt; No, by default it would go to /cpuset/lxc/ct1, since my init task is in<br>
&gt; cgroup /.<br>
&gt;<br>
&gt; If I&#39;m now restarting it in a container which is in /cpuset/lxc/ct3,<br>
&gt; then  it gets moved to /cpuset/lxc/ct3/lxc/ct1.<br>
<br>
</div></div>Ah, I see. So we always recreate the same hierarchy structure relative<br>
to wherever criu sits. That&#39;s fine.<br>
<br>
Thanks,<br>
Pavel<br>
<br>
</blockquote></div><br></div>