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:
parent
529f298913
commit
69befdde18
@ -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;
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user