From ecaf0c7bfc1baee74ff38dbdbc65bf4bec2361d4 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Tue, 3 Dec 2019 02:23:34 +0100 Subject: [PATCH] cgroups/freezer: fix and improve cgroup2 freezer implementation Signed-off-by: Christian Brauner --- src/lxc/commands.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/src/lxc/commands.c b/src/lxc/commands.c index 6d24be5f2..588006eb9 100644 --- a/src/lxc/commands.c +++ b/src/lxc/commands.c @@ -1255,6 +1255,72 @@ static int lxc_cmd_unfreeze_callback(int fd, struct lxc_cmd_req *req, return lxc_cmd_rsp_send(fd, &rsp); } +int lxc_cmd_freeze(const char *name, const char *lxcpath, int timeout) +{ + int ret, stopped; + struct lxc_cmd_rr cmd = { + .req = { + .cmd = LXC_CMD_FREEZE, + .data = INT_TO_PTR(timeout), + }, + }; + + ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL); + if (ret <= 0 || cmd.rsp.ret < 0) + return error_log_errno(errno, "Failed to freeze container"); + + return cmd.rsp.ret; +} + +static int lxc_cmd_freeze_callback(int fd, struct lxc_cmd_req *req, + struct lxc_handler *handler, + struct lxc_epoll_descr *descr) +{ + int timeout = PTR_TO_INT(req->data); + struct lxc_cmd_rsp rsp = { + .ret = -ENOENT, + }; + struct cgroup_ops *ops = handler->cgroup_ops; + + if (ops->cgroup_layout == CGROUP_LAYOUT_UNIFIED) + rsp.ret = ops->freeze(ops, timeout); + + return lxc_cmd_rsp_send(fd, &rsp); +} + +int lxc_cmd_unfreeze(const char *name, const char *lxcpath, int timeout) +{ + int ret, stopped; + struct lxc_cmd_rr cmd = { + .req = { + .cmd = LXC_CMD_UNFREEZE, + .data = INT_TO_PTR(timeout), + }, + }; + + ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL); + if (ret <= 0 || cmd.rsp.ret < 0) + return error_log_errno(errno, "Failed to unfreeze container"); + + return cmd.rsp.ret; +} + +static int lxc_cmd_unfreeze_callback(int fd, struct lxc_cmd_req *req, + struct lxc_handler *handler, + struct lxc_epoll_descr *descr) +{ + int timeout = PTR_TO_INT(req->data); + struct lxc_cmd_rsp rsp = { + .ret = -ENOENT, + }; + struct cgroup_ops *ops = handler->cgroup_ops; + + if (ops->cgroup_layout == CGROUP_LAYOUT_UNIFIED) + rsp.ret = ops->unfreeze(ops, timeout); + + return lxc_cmd_rsp_send(fd, &rsp); +} + static int lxc_cmd_process(int fd, struct lxc_cmd_req *req, struct lxc_handler *handler, struct lxc_epoll_descr *descr) -- 2.47.3