Skip to content

Commit

Permalink
cgroups: add croup_set()
Browse files Browse the repository at this point in the history
This is a unified hierarchy only method which doesn't need to initialize a full
cgroup driver. Instead, it relies on the command socket to retrieve a cgroup2
file descriptor to the container's cgroup.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner committed Feb 26, 2021
1 parent 5793c6c commit e0f5c4e
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/lxc/cgroups/cgfsng.c
Expand Up @@ -2675,6 +2675,35 @@ static int device_cgroup_rule_parse(struct device_item *device, const char *key,
return device_cgroup_parse_access(device, ++val);
}

int cgroup_set(struct lxc_conf *conf, const char *name, const char *lxcpath,
const char *filename, const char *value)
{
__do_close int unified_fd = -EBADF;
ssize_t ret;

if (!conf || is_empty_string(filename) || is_empty_string(value) ||
is_empty_string(name) || is_empty_string(lxcpath))
return ret_errno(EINVAL);

unified_fd = lxc_cmd_get_cgroup2_fd(name, lxcpath);
if (unified_fd < 0)
return ret_errno(ENOCGROUP2);

if (strncmp(filename, "devices.", STRLITERALLEN("devices.")) == 0) {
struct device_item device = {};

ret = device_cgroup_rule_parse(&device, filename, value);
if (ret < 0)
return log_error_errno(-1, EINVAL, "Failed to parse device string %s=%s", filename, value);

ret = lxc_cmd_add_bpf_device_cgroup(name, lxcpath, &device);
} else {
ret = lxc_writeat(unified_fd, filename, value, strlen(value));
}

return ret;
}

/* Called externally (i.e. from 'lxc-cgroup') to set new cgroup limits. Here we
* don't have a cgroup_data set up, so we ask the running container through the
* commands API for the cgroup path.
Expand Down
3 changes: 3 additions & 0 deletions src/lxc/cgroups/cgroup.h
Expand Up @@ -193,6 +193,9 @@ __hidden extern int cgroup_attach(const struct lxc_conf *conf, const char *name,
__hidden extern int cgroup_get(struct lxc_conf *conf, const char *name,
const char *lxcpath, const char *filename,
char *buf, size_t len);
__hidden extern int cgroup_set(struct lxc_conf *conf, const char *name,
const char *lxcpath, const char *filename,
const char *value);

static inline bool pure_unified_layout(const struct cgroup_ops *ops)
{
Expand Down

0 comments on commit e0f5c4e

Please sign in to comment.