From 1157d967d0ea55a2f38054a85abf89b8e14cd246 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Thu, 25 Sep 2025 22:28:33 +0200 Subject: [PATCH] core/cgroup: make sure deserialized accounting data is not voided Currently, cgroup_path is (de-)serialized after all the cached accounting data. This is bogus though, since unit_set_cgroup_path() destroys the CGroupRuntime object and starts afresh, discarding all deserialized values. This matters especially for IP accounting, whose BPF maps get recreated on reload/reexec and the previous values are exclusively retrievable from deserialization. Let's hence swap things around and serialize cgroup_path first, accounting data only afterwards. (cherry picked from commit 055a5a236c6776fa281890aa17972c6ed3a1132e) (cherry picked from commit d8b74adbff5dd5312c84e0e44ee64f5267300a3a) --- src/core/cgroup.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 52d09ed1656..f3d4659b044 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -5343,6 +5343,16 @@ int cgroup_runtime_serialize(Unit *u, FILE *f, FDSet *fds) { if (!crt) return 0; + if (crt->cgroup_path) + (void) serialize_item(f, "cgroup", crt->cgroup_path); + if (crt->cgroup_id != 0) + (void) serialize_item_format(f, "cgroup-id", "%" PRIu64, crt->cgroup_id); + + (void) serialize_bool(f, "cgroup-realized", crt->cgroup_realized); + (void) serialize_cgroup_mask(f, "cgroup-realized-mask", crt->cgroup_realized_mask); + (void) serialize_cgroup_mask(f, "cgroup-enabled-mask", crt->cgroup_enabled_mask); + (void) serialize_cgroup_mask(f, "cgroup-invalidated-mask", crt->cgroup_invalidated_mask); + (void) serialize_item_format(f, "cpu-usage-base", "%" PRIu64, crt->cpu_usage_base); if (crt->cpu_usage_last != NSEC_INFINITY) (void) serialize_item_format(f, "cpu-usage-last", "%" PRIu64, crt->cpu_usage_last); @@ -5376,16 +5386,6 @@ int cgroup_runtime_serialize(Unit *u, FILE *f, FDSet *fds) { (void) serialize_item_format(f, io_accounting_metric_field_last_to_string(im), "%" PRIu64, crt->io_accounting_last[im]); } - if (crt->cgroup_path) - (void) serialize_item(f, "cgroup", crt->cgroup_path); - if (crt->cgroup_id != 0) - (void) serialize_item_format(f, "cgroup-id", "%" PRIu64, crt->cgroup_id); - - (void) serialize_bool(f, "cgroup-realized", crt->cgroup_realized); - (void) serialize_cgroup_mask(f, "cgroup-realized-mask", crt->cgroup_realized_mask); - (void) serialize_cgroup_mask(f, "cgroup-enabled-mask", crt->cgroup_enabled_mask); - (void) serialize_cgroup_mask(f, "cgroup-invalidated-mask", crt->cgroup_invalidated_mask); - (void) bpf_socket_bind_serialize(u, f, fds); (void) bpf_program_serialize_attachment(f, fds, "ip-bpf-ingress-installed", crt->ip_bpf_ingress_installed); -- 2.47.3