Skip to content

Commit

Permalink
cgroups: introduce fd-only cgroup attach
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner committed Feb 26, 2021
1 parent b106d22 commit e040efb
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 5 deletions.
16 changes: 11 additions & 5 deletions src/lxc/cgroups/cgfsng.c
Expand Up @@ -3373,21 +3373,23 @@ static int __unified_attach_fd(const struct lxc_conf *conf, int fd_unified, pid_
static int __cgroup_attach_many(const struct lxc_conf *conf, const char *name,
const char *lxcpath, pid_t pid)
{
call_cleaner(put_unix_fds) struct unix_fds *fds = &(struct unix_fds){};
call_cleaner(put_cgroup_ctx) struct cgroup_ctx *ctx = &(struct cgroup_ctx){};
int ret;
char pidstr[INTTYPE_TO_STRLEN(pid_t)];
size_t idx;
ssize_t pidstr_len;

ret = lxc_cmd_get_cgroup_fd(name, lxcpath, NULL, true, fds);
ret = lxc_cmd_get_cgroup_ctx(name, lxcpath, NULL, true,
sizeof(struct cgroup_ctx), ctx);
if (ret < 0)
return ret_errno(ENOSYS);

pidstr_len = strnprintf(pidstr, sizeof(pidstr), "%d", pid);
if (pidstr_len < 0)
return pidstr_len;

for (size_t idx = 0; idx < fds->fd_count_ret; idx++) {
int dfd_con = fds->fd[idx];
for (idx = 0; idx < ctx->fd_len; idx++) {
int dfd_con = ctx->fd[idx];

if (unified_cgroup_fd(dfd_con))
ret = __unified_attach_fd(conf, dfd_con, pid);
Expand All @@ -3399,7 +3401,11 @@ static int __cgroup_attach_many(const struct lxc_conf *conf, const char *name,
TRACE("Attached to cgroup fd %d", dfd_con);
}

return log_trace(0, "Attached to cgroups");
if (idx == 0)
return syserrno_set(-ENOENT, "Failed to attach to cgroups");

TRACE("Attached to %s cgroup layout", cgroup_layout_name(ctx->cgroup_layout));
return 0;
}

static int __cgroup_attach_unified(const struct lxc_conf *conf, const char *name,
Expand Down
16 changes: 16 additions & 0 deletions src/lxc/cgroups/cgroup.h
Expand Up @@ -35,6 +35,22 @@ typedef enum {
CGROUP_LAYOUT_UNIFIED = 2,
} cgroup_layout_t;

static inline const char *cgroup_layout_name(cgroup_layout_t layout)
{
switch (layout) {
case CGROUP_LAYOUT_LEGACY:
return "legacy";
case CGROUP_LAYOUT_HYBRID:
return "hybrid";
case CGROUP_LAYOUT_UNIFIED:
return "unified";
case CGROUP_LAYOUT_UNKNOWN:
break;
}

return "unknown";
}

typedef enum {
LEGACY_HIERARCHY = CGROUP_SUPER_MAGIC,
UNIFIED_HIERARCHY = CGROUP2_SUPER_MAGIC,
Expand Down

0 comments on commit e040efb

Please sign in to comment.