2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-22 01:51:51 +00:00

cgroup-v2: make new field cg_set optional

The new field cg_set is currently marked as required which causes backward
compatibility problem when using newer CRIU version to restore dumped image
from older version. This commit makes this field optional and reworks the
logic to fallback to use cg_set from task_core when it is not in
thread_core.

Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
This commit is contained in:
Bui Quang Minh 2023-03-16 23:09:18 +07:00 committed by Andrei Vagin
parent 529f298913
commit 69befdde18
3 changed files with 11 additions and 5 deletions

View File

@ -811,6 +811,7 @@ static int dump_task_core_all(struct parasite_ctl *ctl, struct pstree_item *item
goto err;
}
core->thread_core->has_cg_set = true;
cg_set = &core->thread_core->cg_set;
ret = dump_thread_cgroup(item, cg_set, info, -1);
if (ret)
@ -1436,6 +1437,7 @@ static int dump_task_cgroup(struct parasite_ctl *parasite_ctl, const struct pstr
return -1;
}
core->thread_core->has_cg_set = true;
if (dump_thread_cgroup(item, &core->thread_core->cg_set, info, i))
return -1;
}

View File

@ -1354,10 +1354,14 @@ static inline int fork_with_pid(struct pstree_item *item)
* Zombie tasks' cgroup is not dumped/restored.
* cg_set == 0 is skipped in prepare_task_cgroup()
*/
if (item->pid->state == TASK_DEAD)
if (item->pid->state == TASK_DEAD) {
rsti(item)->cg_set = 0;
else
rsti(item)->cg_set = ca.core->thread_core->cg_set;
} else {
if (ca.core->thread_core->has_cg_set)
rsti(item)->cg_set = ca.core->thread_core->cg_set;
else
rsti(item)->cg_set = ca.core->tc->cg_set;
}
if (ca.core->tc->has_stop_signo)
item->pid->stop_signo = ca.core->tc->stop_signo;
@ -3824,7 +3828,7 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns
thread_args[i].clear_tid_addr = CORE_THREAD_ARCH_INFO(tcore)->clear_tid_addr;
core_get_tls(tcore, &thread_args[i].tls);
if (rsti(current)->cg_set != tcore->thread_core->cg_set) {
if (tcore->thread_core->has_cg_set && rsti(current)->cg_set != tcore->thread_core->cg_set) {
thread_args[i].cg_set = tcore->thread_core->cg_set;
thread_args[i].cgroupd_sk = dup(get_service_fd(CGROUPD_SK));
} else {

View File

@ -106,7 +106,7 @@ message thread_core_entry {
optional string comm = 13;
optional uint64 blk_sigset_extended = 14;
optional rseq_entry rseq_entry = 15;
required uint32 cg_set = 16;
optional uint32 cg_set = 16;
}
message task_rlimits_entry {