From 4a24b6a7a74edd124fc2e564a04bb93dbb45d71a Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Fri, 19 May 2023 11:55:04 +0200 Subject: [PATCH] cgroup: set the memory limit on the system scope when updating the memory limit, we now set it also on the systemd scope. Signed-off-by: Giuseppe Scrivano --- src/libcrun/cgroup-systemd.c | 40 +++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/libcrun/cgroup-systemd.c b/src/libcrun/cgroup-systemd.c index d0928f3622..84cc72d341 100644 --- a/src/libcrun/cgroup-systemd.c +++ b/src/libcrun/cgroup-systemd.c @@ -606,6 +606,33 @@ open_sd_bus_connection (sd_bus **bus, libcrun_error_t *err) return 0; } +static inline int +get_memory_limit (runtime_spec_schema_config_linux_resources *resources, uint64_t *limit, libcrun_error_t *err) +{ + if (resources->memory && resources->memory->limit_present) + { + *limit = resources->memory->limit; + return 1; + } + + if (resources->unified) + { + size_t i; + + for (i = 0; i < resources->unified->len; i++) + if (strcmp (resources->unified->keys[i], "memory.max") == 0) + { + errno = 0; + *limit = (uint64_t) strtoll (resources->unified->values[i], NULL, 10); + if (UNLIKELY (errno)) + return crun_make_error (err, errno, "invalid value for `memory.max`: %s", + resources->unified->values[i]); + return 1; + } + } + return 0; +} + static inline int get_weight (runtime_spec_schema_config_linux_resources *resources, uint64_t *weight, libcrun_error_t *err) { @@ -642,17 +669,28 @@ append_resources (sd_bus_message *m, int cgroup_mode, libcrun_error_t *err) { + uint64_t memory_limit; int sd_err; + int ret; if (resources == NULL) return 0; + ret = get_memory_limit (resources, &memory_limit, err); + if (UNLIKELY (ret < 0)) + return ret; + if (ret) + { + sd_err = sd_bus_message_append (m, "(sv)", "MemoryLimit", "t", memory_limit); + if (UNLIKELY (sd_err < 0)) + return crun_make_error (err, -sd_err, "sd-bus message append MemoryLimit"); + } + switch (cgroup_mode) { case CGROUP_MODE_UNIFIED: { uint64_t weight; - int ret; ret = get_weight (resources, &weight, err); if (UNLIKELY (ret < 0))