[CRIU] [PATCH] Skip restoring certain cgroup root directories when using full mode
Hui Kang
hkang.sunysb at gmail.com
Fri Aug 21 21:03:44 PDT 2015
On Fri, Aug 21, 2015 at 2:12 PM, Pavel Emelyanov <xemul at parallels.com> wrote:
> On 08/19/2015 12:40 AM, Hui Kang wrote:
>>
>>
>> On Tue, Aug 18, 2015 at 11:13 AM, Pavel Emelyanov <xemul at parallels.com <mailto:xemul at parallels.com>> wrote:
>>
>> 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 <mailto: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 <mailto: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 <mailto: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.
>>
>>
>> HI, Pavel,
>> can you give me an example which has nested directories? I added the process to foo/foo1/tasks and then dump the process. So no value in foo is dumped.
>>
>> For a nested cgroup directory, do you mean I should also add a parent tasks to foo and then dump both parent and child?
>
> Create at least two directories (foo/A and foo/A/B) and two tasks living in each. This will give you
> two entries in image file.
>
> The bug I'm thinking of would happen if you have groups / and /A and two tasks living in each (again).
> With your patch the /A's props will not be restored.
I was trying to make the bug happen as you described. I mkdir such
cgroup strucutre
/sys/fs/cgroup/cpuset/foo
/sys/fs/cgroup/cpuset/foo/A
/sys/fs/cgroup/cpuset/foo/A/B
Step 1: Put task 1001 to /sys/fs/cgroup/cpuset/foo/A and 1002 to
/sys/fs/cgroup/cpuset/foo/A/B
Step 2: Then dump 1001 and 1002 separately.
Step 3: I rmdir /sys/fs/cgroup/cpuset/foo/A and /sys/fs/cgroup/cpuset/foo/A/B.
Note that /sys/fs/cgroup/cpuset/foo still exists and have values in
cpuset.cpu and cpuset.mems
Do you mean the bug will happen when I restore 1001, which is in
/sys/fs/cgroup/cpuset/foo/A? Thanks.
- Hui
>
> -- Pavel
More information about the CRIU
mailing list