<div dir="ltr">The hierarchy created in cgyard mimics the hierarchy in /sys/fs/cgroup for the process being restored except for the systemd and other named hierarchies.<div><br></div><div>As you&#39;ve mentioned, since cgyard will be deleted, this doesn&#39;t really matter but it&#39;d be nice to be consistent like the rest of them (cpu, blkio, etc.) especially when it&#39;s so easy to skip the &quot;name=&quot; part.<div>
<br></div><div>--Saied</div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jun 23, 2014 at 1:44 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="">On 06/21/2014 03:54 AM, Saied Kazemi wrote:<br>
&gt; The restore code in CRIU 1.3rc2 for cgroups does not seem to correctly handle named hierarchies.  A named hierarchy can be created by &quot;mount -t cgroup -o none,name=&lt;name&gt; &lt;source&gt; &lt;target&gt;&quot;.  One such named cgroup is systemd.  Below is a snippet of the cgroup image file after CRIU dump showing the entry for systemd.<br>

&gt;<br>
&gt; # criu show -f img/cgroup.img<br>
&gt; ...<br>
&gt; :{<br>
&gt; name: &quot;name=systemd&quot;<br>
&gt; path: &quot;/user/1000.user/4.session&quot;<br>
&gt; }<br>
&gt; ...<br>
&gt;<br>
&gt; The function prepare_cgroup_sfd() creates a directory called &quot;name=systemd&quot; and mounts it.<br>
&gt;<br>
&gt; I applied the following patch as a quick workaround but I think the issue needs further study.<br>
<br>
</div>But what is the issue exactly in? This directory is just a temporary place for<br>
mounting this cgroups and the whole cgyard gets restroyed after cgroups restore.<br>
<div class="HOEnZb"><div class="h5"><br>
&gt;<br>
&gt; diff --git a/cgroup.c b/cgroup.c<br>
&gt; index 2d9ebad..d2185fb 100644<br>
&gt; --- a/cgroup.c<br>
&gt; +++ b/cgroup.c<br>
&gt; @@ -258,7 +258,10 @@ static int move_in_cgroup(CgSetEntry *se)<br>
&gt;                 int fd, err;<br>
&gt;                 ControllerEntry *ce = se-&gt;ctls[i];<br>
&gt;<br>
&gt; -               sprintf(aux, &quot;%s/%s/tasks&quot;, ce-&gt;name, ce-&gt;path);<br>
&gt; +               if (strstartswith(ce-&gt;name, &quot;name=&quot;))<br>
&gt; +                       sprintf(aux, &quot;%s/%s/tasks&quot;, ce-&gt;name + 5, ce-&gt;path);<br>
&gt; +               else<br>
&gt; +                       sprintf(aux, &quot;%s/%s/tasks&quot;, ce-&gt;name, ce-&gt;path);<br>
&gt;                 pr_debug(&quot;  `-&gt; %s\n&quot;, aux);<br>
&gt;                 err = fd = openat(cg, aux, O_WRONLY);<br>
&gt;                 if (fd &gt;= 0) {<br>
&gt; @@ -366,11 +369,12 @@ static int prepare_cgroup_sfd(CgSetEntry *root_set)<br>
&gt;                 ControllerEntry *ce = root_set-&gt;ctls[i];<br>
&gt;                 char *opt = ce-&gt;name;<br>
&gt;<br>
&gt; -               sprintf(paux + off, &quot;/%s&quot;, ce-&gt;name);<br>
&gt;                 if (strstartswith(ce-&gt;name, &quot;name=&quot;)) {<br>
&gt; +                       sprintf(paux + off, &quot;/%s&quot;, ce-&gt;name + 5);<br>
&gt;                         sprintf(aux, &quot;none,%s&quot;, ce-&gt;name);<br>
&gt;                         opt = aux;<br>
&gt;                 }<br>
&gt; +                       sprintf(paux + off, &quot;/%s&quot;, ce-&gt;name);<br>
&gt;<br>
&gt;                 if (mkdir(paux, 0700)) {<br>
&gt;                         pr_perror(&quot;Can&#39;t make cgyard subdir&quot;);<br>
&gt;<br>
&gt; What do you think?<br>
&gt;<br>
&gt; --Saied<br>
&gt;<br>
<br>
</div></div></blockquote></div><br></div>