chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
util-lib: make timestamp generation and parsing reversible (#3869)
[elogind.git]
/
src
/
basic
/
cgroup-util.c
diff --git
a/src/basic/cgroup-util.c
b/src/basic/cgroup-util.c
index 3636f13da68e9a14034858ff566bf006c76ce118..a19995051198cc6706bc01c9569aa89ff71be3e2 100644
(file)
--- a/
src/basic/cgroup-util.c
+++ b/
src/basic/cgroup-util.c
@@
-134,6
+134,22
@@
int cg_read_event(const char *controller, const char *path, const char *event,
return -ENOENT;
}
return -ENOENT;
}
+#if 0 /// UNNEEDED by elogind
+bool cg_ns_supported(void) {
+ static thread_local int enabled = -1;
+
+ if (enabled >= 0)
+ return enabled;
+
+ if (access("/proc/self/ns/cgroup", F_OK) == 0)
+ enabled = 1;
+ else
+ enabled = 0;
+
+ return enabled;
+}
+#endif //0
+
int cg_enumerate_subgroups(const char *controller, const char *path, DIR **_d) {
_cleanup_free_ char *fs = NULL;
int r;
int cg_enumerate_subgroups(const char *controller, const char *path, DIR **_d) {
_cleanup_free_ char *fs = NULL;
int r;
@@
-197,7
+213,15
@@
int cg_rmdir(const char *controller, const char *path) {
return 0;
}
return 0;
}
-int cg_kill(const char *controller, const char *path, int sig, bool sigcont, bool ignore_self, Set *s) {
+int cg_kill(
+ const char *controller,
+ const char *path,
+ int sig,
+ CGroupFlags flags,
+ Set *s,
+ cg_kill_log_func_t log_kill,
+ void *userdata) {
+
_cleanup_set_free_ Set *allocated_set = NULL;
bool done = false;
int r, ret = 0;
_cleanup_set_free_ Set *allocated_set = NULL;
bool done = false;
int r, ret = 0;
@@
-205,6
+229,11
@@
int cg_kill(const char *controller, const char *path, int sig, bool sigcont, boo
assert(sig >= 0);
assert(sig >= 0);
+ /* Don't send SIGCONT twice. Also, SIGKILL always works even when process is suspended, hence don't send
+ * SIGCONT on SIGKILL. */
+ if (IN_SET(sig, SIGCONT, SIGKILL))
+ flags &= ~CGROUP_SIGCONT;
+
/* 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 */
/* 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 */
@@
-232,19
+261,22
@@
int cg_kill(const char *controller, const char *path, int sig, bool sigcont, boo
while ((r = cg_read_pid(f, &pid)) > 0) {
while ((r = cg_read_pid(f, &pid)) > 0) {
- if (
ignore_self
&& pid == my_pid)
+ if (
(flags & CGROUP_IGNORE_SELF)
&& pid == my_pid)
continue;
if (set_get(s, PID_TO_PTR(pid)) == PID_TO_PTR(pid))
continue;
continue;
if (set_get(s, PID_TO_PTR(pid)) == PID_TO_PTR(pid))
continue;
+ if (log_kill)
+ log_kill(pid, sig, userdata);
+
/* If we haven't killed this process yet, kill
* it */
if (kill(pid, sig) < 0) {
if (ret >= 0 && errno != ESRCH)
ret = -errno;
} else {
/* 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
)
+ if (
flags & CGROUP_SIGCONT
)
(void) kill(pid, SIGCONT);
if (ret == 0)
(void) kill(pid, SIGCONT);
if (ret == 0)
@@
-278,7
+310,15
@@
int cg_kill(const char *controller, const char *path, int sig, bool sigcont, boo
return ret;
}
return ret;
}
-int cg_kill_recursive(const char *controller, const char *path, int sig, bool sigcont, bool ignore_self, bool rem, Set *s) {
+int cg_kill_recursive(
+ const char *controller,
+ const char *path,
+ int sig,
+ CGroupFlags flags,
+ Set *s,
+ cg_kill_log_func_t log_kill,
+ void *userdata) {
+
_cleanup_set_free_ Set *allocated_set = NULL;
_cleanup_closedir_ DIR *d = NULL;
int r, ret;
_cleanup_set_free_ Set *allocated_set = NULL;
_cleanup_closedir_ DIR *d = NULL;
int r, ret;
@@
-293,7
+333,7
@@
int cg_kill_recursive(const char *controller, const char *path, int sig, bool si
return -ENOMEM;
}
return -ENOMEM;
}
- ret = cg_kill(controller, path, sig,
sigcont, ignore_self, s
);
+ ret = cg_kill(controller, path, sig,
flags, s, log_kill, userdata
);
r = cg_enumerate_subgroups(controller, path, &d);
if (r < 0) {
r = cg_enumerate_subgroups(controller, path, &d);
if (r < 0) {
@@
-311,15
+351,14
@@
int cg_kill_recursive(const char *controller, const char *path, int sig, bool si
if (!p)
return -ENOMEM;
if (!p)
return -ENOMEM;
- r = cg_kill_recursive(controller, p, sig,
sigcont, ignore_self, rem, s
);
+ r = cg_kill_recursive(controller, p, sig,
flags, s, log_kill, userdata
);
if (r != 0 && ret >= 0)
ret = r;
}
if (r != 0 && ret >= 0)
ret = r;
}
-
if (ret >= 0 && r < 0)
ret = r;
if (ret >= 0 && r < 0)
ret = r;
- if (
rem
) {
+ if (
flags & CGROUP_REMOVE
) {
r = cg_rmdir(controller, path);
if (r < 0 && ret >= 0 && r != -ENOENT && r != -EBUSY)
return r;
r = cg_rmdir(controller, path);
if (r < 0 && ret >= 0 && r != -ENOENT && r != -EBUSY)
return r;
@@
-328,7
+367,13
@@
int cg_kill_recursive(const char *controller, const char *path, int sig, bool si
return ret;
}
return ret;
}
-int cg_migrate(const char *cfrom, const char *pfrom, const char *cto, const char *pto, bool ignore_self) {
+int cg_migrate(
+ const char *cfrom,
+ const char *pfrom,
+ const char *cto,
+ const char *pto,
+ CGroupFlags flags) {
+
bool done = false;
_cleanup_set_free_ Set *s = NULL;
int r, ret = 0;
bool done = false;
_cleanup_set_free_ Set *s = NULL;
int r, ret = 0;
@@
-347,7
+392,8
@@
int cg_migrate(const char *cfrom, const char *pfrom, const char *cto, const char
log_debug_elogind("Migrating \"%s\"/\"%s\" to \"%s\"/\"%s\" (%s)",
cfrom, pfrom, cto, pto,
log_debug_elogind("Migrating \"%s\"/\"%s\" to \"%s\"/\"%s\" (%s)",
cfrom, pfrom, cto, pto,
- ignore_self ? "ignoring self" : "watching self");
+ (flags & CGROUP_IGNORE_SELF)
+ ? "ignoring self" : "watching self");
do {
_cleanup_fclose_ FILE *f = NULL;
pid_t pid = 0;
do {
_cleanup_fclose_ FILE *f = NULL;
pid_t pid = 0;
@@
-366,7
+412,7
@@
int cg_migrate(const char *cfrom, const char *pfrom, const char *cto, const char
/* This might do weird stuff if we aren't a
* single-threaded program. However, we
* luckily know we are not */
/* This might do weird stuff if we aren't a
* single-threaded program. However, we
* luckily know we are not */
- if (
ignore_self
&& pid == my_pid)
+ if (
(flags & CGROUP_IGNORE_SELF)
&& pid == my_pid)
continue;
if (set_get(s, PID_TO_PTR(pid)) == PID_TO_PTR(pid))
continue;
if (set_get(s, PID_TO_PTR(pid)) == PID_TO_PTR(pid))
@@
-414,8
+460,7
@@
int cg_migrate_recursive(
const char *pfrom,
const char *cto,
const char *pto,
const char *pfrom,
const char *cto,
const char *pto,
- bool ignore_self,
- bool rem) {
+ CGroupFlags flags) {
_cleanup_closedir_ DIR *d = NULL;
int r, ret = 0;
_cleanup_closedir_ DIR *d = NULL;
int r, ret = 0;
@@
-426,7
+471,7
@@
int cg_migrate_recursive(
assert(cto);
assert(pto);
assert(cto);
assert(pto);
- ret = cg_migrate(cfrom, pfrom, cto, pto,
ignore_self
);
+ ret = cg_migrate(cfrom, pfrom, cto, pto,
flags
);
r = cg_enumerate_subgroups(cfrom, pfrom, &d);
if (r < 0) {
r = cg_enumerate_subgroups(cfrom, pfrom, &d);
if (r < 0) {
@@
-444,7
+489,7
@@
int cg_migrate_recursive(
if (!p)
return -ENOMEM;
if (!p)
return -ENOMEM;
- r = cg_migrate_recursive(cfrom, p, cto, pto,
ignore_self, rem
);
+ r = cg_migrate_recursive(cfrom, p, cto, pto,
flags
);
if (r != 0 && ret >= 0)
ret = r;
}
if (r != 0 && ret >= 0)
ret = r;
}
@@
-452,7
+497,7
@@
int cg_migrate_recursive(
if (r < 0 && ret >= 0)
ret = r;
if (r < 0 && ret >= 0)
ret = r;
- if (
rem
) {
+ if (
flags & CGROUP_REMOVE
) {
r = cg_rmdir(cfrom, pfrom);
if (r < 0 && ret >= 0 && r != -ENOENT && r != -EBUSY)
return r;
r = cg_rmdir(cfrom, pfrom);
if (r < 0 && ret >= 0 && r != -ENOENT && r != -EBUSY)
return r;
@@
-466,8
+511,7
@@
int cg_migrate_recursive_fallback(
const char *pfrom,
const char *cto,
const char *pto,
const char *pfrom,
const char *cto,
const char *pto,
- bool ignore_self,
- bool rem) {
+ CGroupFlags flags) {
int r;
int r;
@@
-476,7
+520,7
@@
int cg_migrate_recursive_fallback(
assert(cto);
assert(pto);
assert(cto);
assert(pto);
- r = cg_migrate_recursive(cfrom, pfrom, cto, pto,
ignore_self, rem
);
+ r = cg_migrate_recursive(cfrom, pfrom, cto, pto,
flags
);
if (r < 0) {
char prefix[strlen(pto) + 1];
if (r < 0) {
char prefix[strlen(pto) + 1];
@@
-485,7
+529,7
@@
int cg_migrate_recursive_fallback(
PATH_FOREACH_PREFIX(prefix, pto) {
int q;
PATH_FOREACH_PREFIX(prefix, pto) {
int q;
- q = cg_migrate_recursive(cfrom, pfrom, cto, prefix,
ignore_self, rem
);
+ q = cg_migrate_recursive(cfrom, pfrom, cto, prefix,
flags
);
if (q >= 0)
return q;
}
if (q >= 0)
return q;
}
@@
-1898,7
+1942,6
@@
int cg_set_attribute(const char *controller, const char *path, const char *attri
return write_string_file(p, value, 0);
}
return write_string_file(p, value, 0);
}
-#if 0 /// UNNEEDED by elogind
int cg_get_attribute(const char *controller, const char *path, const char *attribute, char **ret) {
_cleanup_free_ char *p = NULL;
int r;
int cg_get_attribute(const char *controller, const char *path, const char *attribute, char **ret) {
_cleanup_free_ char *p = NULL;
int r;
@@
-1910,6
+1953,7
@@
int cg_get_attribute(const char *controller, const char *path, const char *attri
return read_one_line_file(p, ret);
}
return read_one_line_file(p, ret);
}
+#if 0 /// UNNEEDED by elogind
int cg_create_everywhere(CGroupMask supported, CGroupMask mask, const char *path) {
CGroupController c;
int r, unified;
int cg_create_everywhere(CGroupMask supported, CGroupMask mask, const char *path) {
CGroupController c;
int r, unified;
@@
-2001,7
+2045,7
@@
int cg_migrate_everywhere(CGroupMask supported, const char *from, const char *to
int r = 0, unified;
if (!path_equal(from, to)) {
int r = 0, unified;
if (!path_equal(from, to)) {
- r = cg_migrate_recursive(SYSTEMD_CGROUP_CONTROLLER, from, SYSTEMD_CGROUP_CONTROLLER, to,
false, true
);
+ r = cg_migrate_recursive(SYSTEMD_CGROUP_CONTROLLER, from, SYSTEMD_CGROUP_CONTROLLER, to,
CGROUP_REMOVE
);
if (r < 0)
return r;
}
if (r < 0)
return r;
}
@@
-2025,7
+2069,7
@@
int cg_migrate_everywhere(CGroupMask supported, const char *from, const char *to
if (!p)
p = to;
if (!p)
p = to;
- (void) cg_migrate_recursive_fallback(SYSTEMD_CGROUP_CONTROLLER, to, cgroup_controller_to_string(c), p,
false, false
);
+ (void) cg_migrate_recursive_fallback(SYSTEMD_CGROUP_CONTROLLER, to, cgroup_controller_to_string(c), p,
0
);
}
return 0;
}
return 0;
@@
-2212,8
+2256,8
@@
int cg_unified(void) {
#else
/* elogind can not support the unified hierarchy as a controller,
* so always assume a classical hierarchy.
#else
/* elogind can not support the unified hierarchy as a controller,
* so always assume a classical hierarchy.
- * If,
o
nd only *if*, someone really wants to substitute systemd-login
- * in an environment managed by systemd with elogin, we might have to
+ * If,
a
nd only *if*, someone really wants to substitute systemd-login
+ * in an environment managed by systemd with elogin
d
, we might have to
* add such a support. */
if (F_TYPE_EQUAL(fs.f_type, TMPFS_MAGIC))
#endif // 0
* add such a support. */
if (F_TYPE_EQUAL(fs.f_type, TMPFS_MAGIC))
#endif // 0