From 69befdde1858cbc1235096f21955ccefa4191b00 Mon Sep 17 00:00:00 2001 From: Bui Quang Minh Date: Thu, 16 Mar 2023 23:09:18 +0700 Subject: [PATCH] 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 --- criu/cr-dump.c | 2 ++ criu/cr-restore.c | 12 ++++++++---- images/core.proto | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) 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 {