diff --git a/criu/cr-dump.c b/criu/cr-dump.c index 249c02226..1c1962e8f 100644 --- a/criu/cr-dump.c +++ b/criu/cr-dump.c @@ -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; } diff --git a/criu/cr-restore.c b/criu/cr-restore.c index 195fa5639..f02e95f6d 100644 --- a/criu/cr-restore.c +++ b/criu/cr-restore.c @@ -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 { diff --git a/images/core.proto b/images/core.proto index bc8b7a488..eddd1dc55 100644 --- a/images/core.proto +++ b/images/core.proto @@ -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 {