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

Hui Kang hkang.sunysb at gmail.com
Mon Aug 17 14:55:09 PDT 2015


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": [
        {
            "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