From 068331c965f3011f03e31b67d9791b2f81fd69b0 Mon Sep 17 00:00:00 2001 From: tanyifeng Date: Mon, 14 Jan 2019 11:03:03 +0800 Subject: [PATCH 017/140] isulad: check cgroup cpu.shares after setted Signed-off-by: LiFeng --- src/lxc/cgroups/cgfsng.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index 3e702b3..ab5732b 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -2204,6 +2204,42 @@ static int cg_legacy_set_data(struct cgroup_ops *ops, const char *filename, return ret; } +/* Called from setup_limits - here we have the container's cgroup_data because + * we created the cgroups. + */ +static int cg_legacy_get_data(struct cgroup_ops *ops, const char *filename, + char *value, size_t len) +{ + char *fullpath, *p; + struct hierarchy *h; + int ret = 0; + char *controller = NULL; + + len = strlen(filename); + controller = alloca(len + 1); + (void)strlcpy(controller, filename, len + 1); + + p = strchr(controller, '.'); + if (p) + *p = '\0'; + + + h = get_hierarchy(ops, controller); + if (!h) { + ERROR("Failed to setup limits for the \"%s\" controller. " + "The controller seems to be unused by \"cgfsng\" cgroup " + "driver or not enabled on the cgroup hierarchy", + controller); + errno = ENOENT; + return -ENOENT; + } + + fullpath = must_make_path(h->container_full_path, filename, NULL); + ret = lxc_read_from_file(fullpath, value, len); + free(fullpath); + return ret; +} + static bool __cg_legacy_setup_limits(struct cgroup_ops *ops, struct lxc_list *cgroup_settings, bool do_devices) @@ -2211,6 +2247,8 @@ static bool __cg_legacy_setup_limits(struct cgroup_ops *ops, struct lxc_list *iterator, *next, *sorted_cgroup_settings; struct lxc_cgroup *cg; bool ret = false; + char value[21]; + long long int readvalue, setvalue; if (lxc_list_empty(cgroup_settings)) return true; @@ -2236,6 +2274,29 @@ static bool __cg_legacy_setup_limits(struct cgroup_ops *ops, DEBUG("Set controller \"%s\" set to \"%s\"", cg->subsystem, cg->value); } + // isulad: check cpu shares + if (strcmp(cg->subsystem, "cpu.shares") == 0) { + if (cg_legacy_get_data(ops, cg->subsystem, value, sizeof(value)) < 0) { + SYSERROR("Error get %s", cg->subsystem); + goto out; + } + trim(value); + if (lxc_safe_long_long(cg->value, &setvalue) != 0) { + SYSERROR("Invalid value %s", cg->value); + goto out; + } + if (lxc_safe_long_long(value, &readvalue) != 0) { + SYSERROR("Invalid value %s", value); + goto out; + } + if (setvalue > readvalue) { + ERROR("The maximum allowed cpu-shares is %s", value); + goto out; + } else if (setvalue < readvalue) { + ERROR("The minimum allowed cpu-shares is %s", value); + goto out; + } + } } ret = true; -- 1.8.3.1