[CRIU] [PATCH] Skip restoring certain cgroup root directories when using full mode

Pavel Emelyanov xemul at parallels.com
Tue Aug 18 08:13:46 PDT 2015


On 08/18/2015 12:55 AM, Hui Kang wrote:
> On Mon, Aug 17, 2015 at 10:48 AM, Pavel Emelyanov <xemul at parallels.com> wrote:
>> On 08/17/2015 08:07 AM, Hui Kang wrote:
>>> On Sun, Aug 16, 2015 at 9:20 PM, Pavel Emelyanov <xemul at parallels.com> wrote:
>>>> On 08/13/2015 07:41 PM, Hui Kang wrote:
>>>>> Skip these top cgroup directories: cpu, cpuset, cpuacct, memory
>>>>>
>>>>> Signed-off-by: Hui Kang <hkang.sunysb at gmail.com>
>>>>> ---
>>>>>  cgroup.c | 4 ++++
>>>>>  1 file changed, 4 insertions(+)
>>>>>
>>>>> diff --git a/cgroup.c b/cgroup.c
>>>>> index a4e0146..94749b1 100644
>>>>> --- a/cgroup.c
>>>>> +++ b/cgroup.c
>>>>> @@ -992,6 +992,10 @@ static int prepare_cgroup_dir_properties(char *path, int off, CgroupDirEntry **e
>>>>>               CgroupDirEntry *e = ents[i];
>>>>>               size_t off2 = off;
>>>>>
>>>>> +             if (strcmp(e->dir_name, "") == 0 &&
>>>>> +                 ((strstr(path, "cpu")) || (strstr(path, "memory"))))
>>>>> +                     continue;
>>>>> +
>>>>
>>>> With this "continue" won't we skip all the properties restore? The e-s we
>>>> have here represent all the tree, starting from root and descending. If you
>>>> skip the root one, then the whole subtree is skipped too.
>>>
>>> No. Although the e-s represent the tree, the for loops will iterate
>>> all the directories.
>>
>> The loop iterates top-level directories, then dives into children. Can you show
>> the contents of your cgroup.img file?
> 
> {
>     "magic": "CGROUP",
>     "entries": [

Ah, I see. The thing is that in your case you don't have nested directories. In
particular -- cpuset is only the "foo/foo1" dir, so your check doesn't match
one and it's restored. The cpu/cpuacct are both "/" only, so you check matches
them, skips, but we notice nothing as there are no sub-directories.

And for the same reason restore-special-props works OK -- the cpuset controller
is "foo/foo1", so it gets restored successfully.

So my concern about the wrong place for strcmp(name, "") check still stands.

-- Pavel

>         {
>             "sets": [
>                 {
>                     "id": 2,
>                     "ctls": [
>                         {
>                             "name": "blkio",
>                             "path": "/"
>                         },
>                         {
>                             "name": "cpu",
>                             "path": "/"
>                         },
>                         {
>                             "name": "cpuacct",
>                             "path": "/"
>                         },
>                         {
>                             "name": "cpuset",
>                             "path": "/foo/foo1"
>                         },
>                         {
>                             "name": "devices",
>                             "path": "/"
>                         },
>                         {
>                             "name": "freezer",
>                             "path": "/"
>                         },
>                         {
>                             "name": "hugetlb",
>                             "path": "/"
>                         },
>                         {
>                             "name": "memory",
>                             "path": "/"
>                         },
>                         {
>                             "name": "name=systemd",
>                             "path": "/"
>                         },
>                         {
>                             "name": "perf_event",
>                             "path": "/"
>                         }
>                     ]
>                 }
>             ],
>             "controllers": [
>                 {
>                     "cnames": [
>                         "cpuset"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": "foo/foo1",
>                             "properties": [
>                                 {
>                                     "name": "cpuset.cpus",
>                                     "value": "1"
>                                 },
>                                 {
>                                     "name": "cpuset.mems",
>                                     "value": "0"
>                                 },
>                                 {
>                                     "name": "cpuset.memory_migrate",
>                                     "value": "0"
>                                 },
>                                 {
>                                     "name": "cpuset.cpu_exclusive",
>                                     "value": "0"
>                                 },
>                                 {
>                                     "name": "cpuset.mem_exclusive",
>                                     "value": "0"
>                                 },
>                                 {
>                                     "name": "cpuset.mem_hardwall",
>                                     "value": "0"
>                                 },
>                                 {
>                                     "name": "cpuset.memory_spread_page",
>                                     "value": "0"
>                                 },
>                                 {
>                                     "name": "cpuset.memory_spread_slab",
>                                     "value": "0"
>                                 },
>                                 {
>                                     "name": "cpuset.sched_load_balance",
>                                     "value": "1"
>                                 },
>                                 {
>                                     "name": "cpuset.sched_relax_domain_level",
>                                     "value": "-1"
>                                 },
>                                 {
>                                     "name": "notify_on_release",
>                                     "value": "0"
>                                 }
>                             ]
>                         }
>                     ]
>                 },
>                 {
>                     "cnames": [
>                         "cpu"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": "",
>                             "properties": [
>                                 {
>                                     "name": "cpu.shares",
>                                     "value": "1024"
>                                 },
>                                 {
>                                     "name": "cpu.cfs_period_us",
>                                     "value": "100000"
>                                 },
>                                 {
>                                     "name": "cpu.cfs_quota_us",
>                                     "value": "-1"
>                                 },
>                                 {
>                                     "name": "notify_on_release",
>                                     "value": "0"
>                                 }
>                             ]
>                         }
>                     ]
>                 },
>                 {
>                     "cnames": [
>                         "cpuacct"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": ""
>                         }
>                     ]
>                 },
>                 {
>                     "cnames": [
>                         "memory"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": "",
>                             "properties": [
>                                 {
>                                     "name": "memory.limit_in_bytes",
>                                     "value": "-1"
>                                 },
>                                 {
>                                     "name": "memory.use_hierarchy",
>                                     "value": "0"
>                                 },
>                                 {
>                                     "name": "notify_on_release",
>                                     "value": "0"
>                                 }
>                             ]
>                         }
>                     ]
>                 },
>                 {
>                     "cnames": [
>                         "devices"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": ""
>                         }
>                     ]
>                 },
>                 {
>                     "cnames": [
>                         "freezer"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": "",
>                             "properties": [
>                                 {
>                                     "name": "notify_on_release",
>                                     "value": "0"
>                                 }
>                             ]
>                         }
>                     ]
>                 },
>                 {
>                     "cnames": [
>                         "blkio"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": "",
>                             "properties": [
>                                 {
>                                     "name": "blkio.weight",
>                                     "value": "1000"
>                                 },
>                                 {
>                                     "name": "notify_on_release",
>                                     "value": "0"
>                                 }
>                             ]
>                         }
>                     ]
>                 },
>                 {
>                     "cnames": [
>                         "perf_event"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": ""
>                         }
>                     ]
>                 },
>                 {
>                     "cnames": [
>                         "hugetlb"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": ""
>                         }
>                     ]
>                 },
>                 {
>                     "cnames": [
>                         "name=systemd"
>                     ],
>                     "dirs": [
>                         {
>                             "dir_name": ""
>                         }
>                     ]
>                 }
>             ]
>         }
>     ]
> }
> 
>>
>>> With "full" mode, the top "cpu" and "mem"
>>> directories should be skipped. The first condition
>>> (strcmp(e->dir_name, "") guarantees that non-root directory will be
>>> restored. For a dumped process with cgroup tree "cpuset/foo/foo1". The
>>> restore process with "full" mode is like
>>>
>>> (00.046731) cg: Restored cgroup property value 1 to cpuset/foo/foo1/cpuset.cpus
>>>
>>> (00.046803) cg: Restored cgroup property value 0 to cpuset/foo/foo1/cpuset.mems
>>>
>>> ... (after all foo1 properties are restore, the it moves to the top level)
>>>
>>> (00.047287) cg: ---> Skip Empty name for top path cpu , top dir
>>>
>>> As you can see, the patch will only skip those root directories.
>>>
>>> One side observations is that the property values of the intermediate
>>> level (e.g., cpuset/foo) is not dumpped. I confirmed this by running
>>> crit decode -i cgroup.img --pretty. So when restoring, I have to
>>> manually create cpuset/foo and populate the value. Is this a bug of
>>> CRIU?
>>
>> CRIU only messes with the cgroups tasks live in, so if they don't live
>> in foo/ then foo will not be restored. And now it seems strange to me
>> that the root one is being restored by criu.
> 
> When you use "--mange-cgroup=full", criu will try to restore
> /sys/fs/cgroup/cpusets/cpuset.cpus, which is not supposed to be
> written.
> But this will not happen with the default "soft" mode; the code sets
> n_properties = 0.
> 
> if (opts.manage_cgroups & (CG_MODE_SOFT | CG_MODE_NONE)) {
>                                 pr_info("Skip restoring properties on
> cgroup dir %s\n", paux);
> if (e->n_properties > 0) {
>                                         xfree(e->properties);
>                                         e->properties = NULL;
>                                         e->n_properties = 0;
>                                 }
>                         }
> 
> - Hui
> 
>>
>> -- Pavel
>>
> .
> 



More information about the CRIU mailing list