Skip to content

Commit

Permalink
Merge pull request #1217 from giuseppe/set-mem-limit-cgroup-systemd
Browse files Browse the repository at this point in the history
cgroup: set the memory limit on the system scope
  • Loading branch information
flouthoc authored May 19, 2023
2 parents e059e80 + 6494b69 commit 23ba994
Showing 1 changed file with 47 additions and 17 deletions.
64 changes: 47 additions & 17 deletions src/libcrun/cgroup-systemd.c
Original file line number Diff line number Diff line change
Expand Up @@ -606,6 +606,40 @@ open_sd_bus_connection (sd_bus **bus, libcrun_error_t *err)
return 0;
}

static int
get_value_from_unified_map (runtime_spec_schema_config_linux_resources *resources, const char *name,
uint64_t *value, libcrun_error_t *err)
{
size_t i;

if (resources == NULL || resources->unified == NULL)
return 0;

for (i = 0; i < resources->unified->len; i++)
if (strcmp (resources->unified->keys[i], name) == 0)
{
errno = 0;
*value = (uint64_t) strtoll (resources->unified->values[i], NULL, 10);
if (UNLIKELY (errno))
return crun_make_error (err, errno, "invalid value for `%s`: %s", name,
resources->unified->values[i]);
return 1;
}
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;
}

return get_value_from_unified_map (resources, "memory.max", limit, err);
}

static inline int
get_weight (runtime_spec_schema_config_linux_resources *resources, uint64_t *weight, libcrun_error_t *err)
{
Expand All @@ -618,22 +652,7 @@ get_weight (runtime_spec_schema_config_linux_resources *resources, uint64_t *wei
return 1;
}

if (resources->unified)
{
size_t i;

for (i = 0; i < resources->unified->len; i++)
if (strcmp (resources->unified->keys[i], "cpu.weight") == 0)
{
errno = 0;
*weight = (uint64_t) strtoll (resources->unified->values[i], NULL, 10);
if (UNLIKELY (errno))
return crun_make_error (err, errno, "invalid value for `cpu.weight`: %s",
resources->unified->values[i]);
return 1;
}
}
return 0;
return get_value_from_unified_map (resources, "cpu.weight", weight, err);
}

static int
Expand All @@ -642,17 +661,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))
Expand Down

0 comments on commit 23ba994

Please sign in to comment.