From b7fb6ec34f947fb7cc7718b7987a7943f6f13633 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 8 Apr 2025 01:28:17 +0900 Subject: [PATCH 1/3] nspawn/oci: also set CPUQuotaPeriodUSec DBus property --- src/nspawn/nspawn-oci.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/nspawn/nspawn-oci.c b/src/nspawn/nspawn-oci.c index 923e20b5c03..acd37255f03 100644 --- a/src/nspawn/nspawn-oci.c +++ b/src/nspawn/nspawn-oci.c @@ -1206,15 +1206,13 @@ static int oci_cgroup_cpu_shares(const char *name, sd_json_variant *v, sd_json_d } static int oci_cgroup_cpu_quota(const char *name, sd_json_variant *v, sd_json_dispatch_flags_t flags, void *userdata) { - uint64_t *u = ASSERT_PTR(userdata); - uint64_t k; + uint64_t k, *u = ASSERT_PTR(userdata); k = sd_json_variant_unsigned(v); if (k <= 0 || k >= UINT64_MAX) - return json_log(v, flags, SYNTHETIC_ERRNO(ERANGE), - "period/quota value out of range."); + return json_log(v, flags, SYNTHETIC_ERRNO(ERANGE), "period/quota value out of range."); - *u = (uint64_t) k; + *u = k; return 0; } @@ -1282,7 +1280,11 @@ static int oci_cgroup_cpu(const char *name, sd_json_variant *v, sd_json_dispatch if (r < 0) return r; - r = sd_bus_message_append(s->properties, "(sv)", "CPUQuotaPerSecUSec", "t", (uint64_t) (data.quota * USEC_PER_SEC / data.period)); + r = sd_bus_message_append(s->properties, "(sv)", "CPUQuotaPerSecUSec", "t", data.quota * USEC_PER_SEC / data.period); + if (r < 0) + return bus_log_create_error(r); + + r = sd_bus_message_append(s->properties, "(sv)", "CPUQuotaPeriodUSec", "t", data.period); if (r < 0) return bus_log_create_error(r); From 173ffdaffb4e6541f2083e0709970d48fe2bd6eb Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 8 Apr 2025 01:29:15 +0900 Subject: [PATCH 2/3] nspawn/oci: replace use of deprecated CPUShares with CPUWeight --- src/nspawn/nspawn-oci.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/nspawn/nspawn-oci.c b/src/nspawn/nspawn-oci.c index acd37255f03..f10ae930a26 100644 --- a/src/nspawn/nspawn-oci.c +++ b/src/nspawn/nspawn-oci.c @@ -1186,22 +1186,22 @@ static int oci_cgroup_memory(const char *name, sd_json_variant *v, sd_json_dispa } struct cpu_data { - uint64_t shares; + uint64_t weight; uint64_t quota; uint64_t period; CPUSet cpu_set; }; static int oci_cgroup_cpu_shares(const char *name, sd_json_variant *v, sd_json_dispatch_flags_t flags, void *userdata) { - uint64_t *u = ASSERT_PTR(userdata); - uint64_t k; + uint64_t k, *u = ASSERT_PTR(userdata); k = sd_json_variant_unsigned(v); if (k < CGROUP_CPU_SHARES_MIN || k > CGROUP_CPU_SHARES_MAX) - return json_log(v, flags, SYNTHETIC_ERRNO(ERANGE), - "shares value out of range."); + return json_log(v, flags, SYNTHETIC_ERRNO(ERANGE), "shares value out of range."); - *u = (uint64_t) k; + /* convert from cgroup v1 cpu.shares to v2 cpu.weight */ + assert_cc(CGROUP_CPU_SHARES_MAX <= UINT64_MAX / CGROUP_WEIGHT_DEFAULT); + *u = CLAMP(k * CGROUP_WEIGHT_DEFAULT / CGROUP_CPU_SHARES_DEFAULT, CGROUP_WEIGHT_MIN, CGROUP_WEIGHT_MAX); return 0; } @@ -1237,7 +1237,7 @@ static int oci_cgroup_cpu_cpus(const char *name, sd_json_variant *v, sd_json_dis static int oci_cgroup_cpu(const char *name, sd_json_variant *v, sd_json_dispatch_flags_t flags, void *userdata) { static const sd_json_dispatch_field table[] = { - { "shares", SD_JSON_VARIANT_UNSIGNED, oci_cgroup_cpu_shares, offsetof(struct cpu_data, shares), 0 }, + { "shares", SD_JSON_VARIANT_UNSIGNED, oci_cgroup_cpu_shares, offsetof(struct cpu_data, weight), 0 }, { "quota", SD_JSON_VARIANT_UNSIGNED, oci_cgroup_cpu_quota, offsetof(struct cpu_data, quota), 0 }, { "period", SD_JSON_VARIANT_UNSIGNED, oci_cgroup_cpu_quota, offsetof(struct cpu_data, period), 0 }, { "realtimeRuntime", SD_JSON_VARIANT_UNSIGNED, oci_unsupported, 0, 0 }, @@ -1248,7 +1248,7 @@ static int oci_cgroup_cpu(const char *name, sd_json_variant *v, sd_json_dispatch }; struct cpu_data data = { - .shares = UINT64_MAX, + .weight = UINT64_MAX, .quota = UINT64_MAX, .period = UINT64_MAX, }; @@ -1265,12 +1265,12 @@ static int oci_cgroup_cpu(const char *name, sd_json_variant *v, sd_json_dispatch cpu_set_reset(&s->cpu_set); s->cpu_set = data.cpu_set; - if (data.shares != UINT64_MAX) { + if (data.weight != UINT64_MAX) { r = settings_allocate_properties(s); if (r < 0) return r; - r = sd_bus_message_append(s->properties, "(sv)", "CPUShares", "t", data.shares); + r = sd_bus_message_append(s->properties, "(sv)", "CPUWeight", "t", data.weight); if (r < 0) return bus_log_create_error(r); } From aed61aa3828704c5d6437ca009c3960453a7016d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 8 Apr 2025 01:50:50 +0900 Subject: [PATCH 3/3] nspawn/oci: replace use of deprecated BlockIOWeight/BlockIODeviceWeight with IOWeight/IODeviceWeight --- src/nspawn/nspawn-oci.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/nspawn/nspawn-oci.c b/src/nspawn/nspawn-oci.c index f10ae930a26..1e339e0208a 100644 --- a/src/nspawn/nspawn-oci.c +++ b/src/nspawn/nspawn-oci.c @@ -1295,6 +1295,13 @@ static int oci_cgroup_cpu(const char *name, sd_json_variant *v, sd_json_dispatch return 0; } +static uint64_t cgroup_weight_blkio_to_io(uint64_t blkio_weight) { + /* convert from cgroup v1 blkio.weight to v2 io.weight */ + assert_cc(CGROUP_BLKIO_WEIGHT_MAX <= UINT64_MAX / CGROUP_WEIGHT_DEFAULT); + return CLAMP(blkio_weight * CGROUP_WEIGHT_DEFAULT / CGROUP_BLKIO_WEIGHT_DEFAULT, + CGROUP_WEIGHT_MIN, CGROUP_WEIGHT_MAX); +} + static int oci_cgroup_block_io_weight(const char *name, sd_json_variant *v, sd_json_dispatch_flags_t flags, void *userdata) { Settings *s = ASSERT_PTR(userdata); uint64_t k; @@ -1309,7 +1316,7 @@ static int oci_cgroup_block_io_weight(const char *name, sd_json_variant *v, sd_j if (r < 0) return r; - r = sd_bus_message_append(s->properties, "(sv)", "BlockIOWeight", "t", (uint64_t) k); + r = sd_bus_message_append(s->properties, "(sv)", "IOWeight", "t", cgroup_weight_blkio_to_io(k)); if (r < 0) return bus_log_create_error(r); @@ -1361,7 +1368,8 @@ static int oci_cgroup_block_io_weight_device(const char *name, sd_json_variant * if (r < 0) return r; - r = sd_bus_message_append(s->properties, "(sv)", "BlockIODeviceWeight", "a(st)", 1, path, (uint64_t) data.weight); + r = sd_bus_message_append(s->properties, "(sv)", "IODeviceWeight", "a(st)", 1, + path, cgroup_weight_blkio_to_io(data.weight)); if (r < 0) return bus_log_create_error(r); }