From: Christian Brauner Date: Wed, 24 Feb 2021 10:11:08 +0000 (+0100) Subject: commands: add LXC_CMD_GET_CGROUP_FD and LXC_CMD_GET_LIMIT_CGROUP_FD X-Git-Tag: lxc-5.0.0~269^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c206ac24b3d974d9b9f2e07d415dbf851179afa2;p=thirdparty%2Flxc.git commands: add LXC_CMD_GET_CGROUP_FD and LXC_CMD_GET_LIMIT_CGROUP_FD Signed-off-by: Christian Brauner --- diff --git a/src/lxc/commands.c b/src/lxc/commands.c index b94b94253..2df32ae22 100644 --- a/src/lxc/commands.c +++ b/src/lxc/commands.c @@ -89,6 +89,8 @@ static const char *lxc_cmd_str(lxc_cmd_t cmd) [LXC_CMD_GET_DEVPTS_FD] = "get_devpts_fd", [LXC_CMD_GET_SECCOMP_NOTIFY_FD] = "get_seccomp_notify_fd", [LXC_CMD_GET_CGROUP_CTX] = "get_cgroup_ctx", + [LXC_CMD_GET_CGROUP_FD] = "get_cgroup_fd", + [LXC_CMD_GET_LIMIT_CGROUP_FD] = "get_limit_cgroup_fd", }; if (cmd >= LXC_CMD_MAX) @@ -138,6 +140,10 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd) cur_cmdstr = lxc_cmd_str(cur_cmd); switch (cur_cmd) { + case LXC_CMD_GET_CGROUP_FD: + __fallthrough; + case LXC_CMD_GET_LIMIT_CGROUP_FD: + __fallthrough; case LXC_CMD_GET_CGROUP2_FD: __fallthrough; case LXC_CMD_GET_LIMIT_CGROUP2_FD: @@ -188,6 +194,10 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd) } switch (cur_cmd) { + case LXC_CMD_GET_CGROUP_FD: + __fallthrough; + case LXC_CMD_GET_LIMIT_CGROUP_FD: + __fallthrough; case LXC_CMD_GET_CGROUP2_FD: __fallthrough; case LXC_CMD_GET_LIMIT_CGROUP2_FD: @@ -1565,6 +1575,94 @@ static int lxc_cmd_unfreeze_callback(int fd, struct lxc_cmd_req *req, return lxc_cmd_rsp_send_reap(fd, &rsp); } +int lxc_cmd_get_cgroup_fd(const char *name, const char *lxcpath, + const char *controller, cgroupfs_type_magic_t type) +{ + int ret, stopped; + struct lxc_cmd_rr cmd = { + .req = { + .cmd = LXC_CMD_GET_CGROUP_FD, + }, + .rsp = { + ret = -ENOSYS, + }, + }; + + ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL); + if (ret < 0) + return -1; + + if (cmd.rsp.ret < 0) + return syserrno_set(cmd.rsp.ret, "Failed to receive cgroup fd"); + + return PTR_TO_INT(cmd.rsp.data); +} + +int lxc_cmd_get_limit_cgroup_fd(const char *name, const char *lxcpath, + const char *controller, + cgroupfs_type_magic_t type) +{ + int ret, stopped; + struct lxc_cmd_rr cmd = { + .req = { + .cmd = LXC_CMD_GET_LIMIT_CGROUP_FD, + }, + .rsp = { + ret = -ENOSYS, + }, + }; + + ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL); + if (ret < 0) + return -1; + + if (cmd.rsp.ret < 0) + return syserrno_set(cmd.rsp.ret, "Failed to receive cgroup fd"); + + return PTR_TO_INT(cmd.rsp.data); +} + +static int __lxc_cmd_get_cgroup_fd_callback(int fd, struct lxc_cmd_req *req, + struct lxc_handler *handler, + struct lxc_epoll_descr *descr, + bool limiting_cgroup) +{ + struct lxc_cmd_rsp rsp = { + .ret = -EINVAL, + }; + struct cgroup_ops *ops = handler->cgroup_ops; + int send_fd; + + if (!pure_unified_layout(ops) || !ops->unified) + return lxc_cmd_rsp_send_reap(fd, &rsp); + + /* FIXME */ + send_fd = limiting_cgroup ? ops->unified->dfd_lim + : ops->unified->dfd_con; + + if (send_fd < 0) { + rsp.ret = -EBADF; + return lxc_cmd_rsp_send_reap(fd, &rsp); + } + + rsp.ret = 0; + return rsp_one_fd(fd, send_fd, &rsp); +} + +static int lxc_cmd_get_cgroup_fd_callback(int fd, struct lxc_cmd_req *req, + struct lxc_handler *handler, + struct lxc_epoll_descr *descr) +{ + return __lxc_cmd_get_cgroup_fd_callback(fd, req, handler, descr, false); +} + +static int lxc_cmd_get_limit_cgroup_fd_callback(int fd, struct lxc_cmd_req *req, + struct lxc_handler *handler, + struct lxc_epoll_descr *descr) +{ + return __lxc_cmd_get_cgroup_fd_callback(fd, req, handler, descr, true); +} + int lxc_cmd_get_cgroup2_fd(const char *name, const char *lxcpath) { int ret, stopped; @@ -1693,6 +1791,8 @@ static int lxc_cmd_process(int fd, struct lxc_cmd_req *req, [LXC_CMD_GET_DEVPTS_FD] = lxc_cmd_get_devpts_fd_callback, [LXC_CMD_GET_SECCOMP_NOTIFY_FD] = lxc_cmd_get_seccomp_notify_fd_callback, [LXC_CMD_GET_CGROUP_CTX] = lxc_cmd_get_cgroup_ctx_callback, + [LXC_CMD_GET_CGROUP_FD] = lxc_cmd_get_cgroup_fd_callback, + [LXC_CMD_GET_LIMIT_CGROUP_FD] = lxc_cmd_get_limit_cgroup_fd_callback, }; if (req->cmd >= LXC_CMD_MAX) diff --git a/src/lxc/commands.h b/src/lxc/commands.h index 0477a04de..79faf1e83 100644 --- a/src/lxc/commands.h +++ b/src/lxc/commands.h @@ -45,6 +45,8 @@ typedef enum { LXC_CMD_GET_DEVPTS_FD = 21, LXC_CMD_GET_SECCOMP_NOTIFY_FD = 22, LXC_CMD_GET_CGROUP_CTX = 23, + LXC_CMD_GET_CGROUP_FD = 24, + LXC_CMD_GET_LIMIT_CGROUP_FD = 25, LXC_CMD_MAX, } lxc_cmd_t; @@ -137,11 +139,17 @@ __hidden extern int lxc_cmd_add_bpf_device_cgroup(const char *name, const char * __hidden extern int lxc_cmd_freeze(const char *name, const char *lxcpath, int timeout); __hidden extern int lxc_cmd_unfreeze(const char *name, const char *lxcpath, int timeout); __hidden extern int lxc_cmd_get_cgroup2_fd(const char *name, const char *lxcpath); +__hidden extern int lxc_cmd_get_cgroup_fd(const char *name, const char *lxcpath, + const char *controller, cgroupfs_type_magic_t type); __hidden extern char *lxc_cmd_get_limit_cgroup_path(const char *name, const char *lxcpath, const char *subsystem); __hidden extern int lxc_cmd_get_limit_cgroup2_fd(const char *name, const char *lxcpath); +__hidden extern int lxc_cmd_get_limit_cgroup_fd(const char *name, + const char *lxcpath, + const char *controller, + cgroupfs_type_magic_t type); __hidden extern int lxc_cmd_get_devpts_fd(const char *name, const char *lxcpath); #endif /* __commands_h */