diff options
-rw-r--r-- | src/shared/Makefile.am | 2 | ||||
-rw-r--r-- | src/shared/cgroup-util.c | 250 | ||||
-rw-r--r-- | src/shared/cgroup-util.h | 51 | ||||
-rw-r--r-- | src/udev/udevd.c | 6 |
4 files changed, 0 insertions, 309 deletions
diff --git a/src/shared/Makefile.am b/src/shared/Makefile.am index 02bb294d30..b18ba192b2 100644 --- a/src/shared/Makefile.am +++ b/src/shared/Makefile.am @@ -5,7 +5,6 @@ AM_CPPFLAGS = \ -include $(top_builddir)/config.h libudev_shared_la_SOURCES=\ - cgroup-util.c \ conf-files.c \ device-nodes.c \ dev-setup.c \ @@ -34,7 +33,6 @@ libudev_shared_la_SOURCES=\ virt.c noinst_HEADERS = \ - cgroup-util.h \ conf-files.h \ def.h \ device-nodes.h \ diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c deleted file mode 100644 index 326b75f763..0000000000 --- a/src/shared/cgroup-util.c +++ /dev/null @@ -1,250 +0,0 @@ -/*** - This file is part of eudev, forked from systemd. - - Copyright 2010 Lennart Poettering - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see <http://www.gnu.org/licenses/>. -***/ - -#include <errno.h> -#include <signal.h> -#include <string.h> -#include <stdlib.h> -#include <sys/types.h> - -#include "cgroup-util.h" -#include "set.h" -#include "process-util.h" -#include "path-util.h" - -int cg_enumerate_processes(const char *controller, const char *path, FILE **_f) { - _cleanup_free_ char *fs = NULL; - FILE *f; - int r; - - assert(_f); - - r = cg_get_path(controller, path, "cgroup.procs", &fs); - if (r < 0) - return r; - - f = fopen(fs, "re"); - if (!f) - return -errno; - - *_f = f; - return 0; -} - -int cg_read_pid(FILE *f, pid_t *_pid) { - unsigned long ul; - - /* Note that the cgroup.procs might contain duplicates! See - * cgroups.txt for details. */ - - assert(f); - assert(_pid); - - errno = 0; - if (fscanf(f, "%lu", &ul) != 1) { - - if (feof(f)) - return 0; - - return errno ? -errno : -EIO; - } - - if (ul <= 0) - return -EIO; - - *_pid = (pid_t) ul; - return 1; -} - -int cg_kill(const char *controller, const char *path, int sig, bool sigcont, bool ignore_self, Set *s) { - _cleanup_set_free_ Set *allocated_set = NULL; - bool done = false; - int r, ret = 0; - pid_t my_pid; - - assert(sig >= 0); - - /* This goes through the tasks list and kills them all. This - * is repeated until no further processes are added to the - * tasks list, to properly handle forking processes */ - - if (!s) { - s = allocated_set = set_new(NULL); - if (!s) - return -ENOMEM; - } - - my_pid = getpid(); - - do { - _cleanup_fclose_ FILE *f = NULL; - pid_t pid = 0; - done = true; - - r = cg_enumerate_processes(controller, path, &f); - if (r < 0) { - if (ret >= 0 && r != -ENOENT) - return r; - - return ret; - } - - while ((r = cg_read_pid(f, &pid)) > 0) { - - if (ignore_self && pid == my_pid) - continue; - - if (set_get(s, LONG_TO_PTR(pid)) == LONG_TO_PTR(pid)) - continue; - - /* If we haven't killed this process yet, kill - * it */ - if (kill(pid, sig) < 0) { - if (ret >= 0 && errno != ESRCH) - ret = -errno; - } else { - if (sigcont && sig != SIGKILL) - kill(pid, SIGCONT); - - if (ret == 0) - ret = 1; - } - - done = false; - - r = set_put(s, LONG_TO_PTR(pid)); - if (r < 0) { - if (ret >= 0) - return r; - - return ret; - } - } - - if (r < 0) { - if (ret >= 0) - return r; - - return ret; - } - - /* To avoid racing against processes which fork - * quicker than we can kill them we repeat this until - * no new pids need to be killed. */ - - } while (!done); - - return ret; -} - -static const char *normalize_controller(const char *controller) { - - assert(controller); - - if (streq(controller, SYSTEMD_CGROUP_CONTROLLER)) - return "systemd"; - else if (startswith(controller, "name=")) - return controller + 5; - else - return controller; -} - -static int join_path(const char *controller, const char *path, const char *suffix, char **fs) { - char *t = NULL; - - if (!isempty(controller)) { - if (!isempty(path) && !isempty(suffix)) - t = strjoin("/sys/fs/cgroup/", controller, "/", path, "/", suffix, NULL); - else if (!isempty(path)) - t = strjoin("/sys/fs/cgroup/", controller, "/", path, NULL); - else if (!isempty(suffix)) - t = strjoin("/sys/fs/cgroup/", controller, "/", suffix, NULL); - else - t = strappend("/sys/fs/cgroup/", controller); - } else { - if (!isempty(path) && !isempty(suffix)) - t = strjoin(path, "/", suffix, NULL); - else if (!isempty(path)) - t = strdup(path); - else - return -EINVAL; - } - - if (!t) - return -ENOMEM; - - *fs = path_kill_slashes(t); - return 0; -} - -int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs) { - const char *p; - static thread_local bool good = false; - - assert(fs); - - if (controller && !cg_controller_is_valid(controller, true)) - return -EINVAL; - - if (_unlikely_(!good)) { - int r; - - r = path_is_mount_point("/sys/fs/cgroup", false); - if (r < 0) - return r; - if (r == 0) - return -ENOENT; - - /* Cache this to save a few stat()s */ - good = true; - } - - p = controller ? normalize_controller(controller) : NULL; - - return join_path(p, path, suffix, fs); -} - -#define CONTROLLER_VALID \ - DIGITS LETTERS \ - "_" - -bool cg_controller_is_valid(const char *p, bool allow_named) { - const char *t, *s; - - if (!p) - return false; - - if (allow_named) { - s = startswith(p, "name="); - if (s) - p = s; - } - - if (*p == 0 || *p == '_') - return false; - - for (t = p; *t; t++) - if (!strchr(CONTROLLER_VALID, *t)) - return false; - - if (t - p > FILENAME_MAX) - return false; - - return true; -} diff --git a/src/shared/cgroup-util.h b/src/shared/cgroup-util.h deleted file mode 100644 index 5c219b204e..0000000000 --- a/src/shared/cgroup-util.h +++ /dev/null @@ -1,51 +0,0 @@ -/*** - This file is part of eudev, forked from systemd. - - Copyright 2010 Lennart Poettering - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see <http://www.gnu.org/licenses/>. -***/ - -#pragma once - -#include <sys/types.h> -#include <stdio.h> -#include <dirent.h> - -#include "set.h" -#include "def.h" - -/* - * General rules: - * - * We accept named hierarchies in the syntax "foo" and "name=foo". - * - * We expect that named hierarchies do not conflict in name with a - * kernel hierarchy, modulo the "name=" prefix. - * - * We always generate "normalized" controller names, i.e. without the - * "name=" prefix. - * - * We require absolute cgroup paths. When returning, we will always - * generate paths with multiple adjacent / removed. - */ - -int cg_enumerate_processes(const char *controller, const char *path, FILE **_f); -int cg_read_pid(FILE *f, pid_t *_pid); - -int cg_kill(const char *controller, const char *path, int sig, bool sigcont, bool ignore_self, Set *s); - -int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs); - -bool cg_controller_is_valid(const char *p, bool allow_named); diff --git a/src/udev/udevd.c b/src/udev/udevd.c index b3fbc27b86..9c33eba5df 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -49,7 +49,6 @@ #include "udev.h" #include "udev-util.h" #include "def.h" -#include "cgroup-util.h" #include "dev-setup.h" #include "fileio.h" #include "hashmap.h" @@ -74,7 +73,6 @@ static usec_t arg_event_timeout_warn_usec = 180 * USEC_PER_SEC / 3; static sigset_t sigmask_orig; static UDEV_LIST(event_list); Hashmap *workers; -static char *udev_cgroup; static struct udev_list properties_list; static bool udev_exit; @@ -1393,10 +1391,6 @@ int main(int argc, char *argv[]) { } else if (udev_list_node_is_empty(&event_list) && hashmap_isempty(workers)) { /* we are idle */ timeout = -1; - - /* cleanup possible left-over processes in our cgroup */ - if (udev_cgroup) - cg_kill(SYSTEMD_CGROUP_CONTROLLER, udev_cgroup, SIGKILL, false, true, NULL); } else { /* kill idle or hanging workers */ timeout = 3 * MSEC_PER_SEC; |