+37
-10
@@ -101,6 +101,39 @@ int cg_read_pid(FILE *f, pid_t *_pid) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int cg_read_event(const char *controller, const char *path, const char *event,
|
||||
char **val)
|
||||
{
|
||||
_cleanup_free_ char *events = NULL, *content = NULL;
|
||||
char *p, *line;
|
||||
int r;
|
||||
|
||||
r = cg_get_path(controller, path, "cgroup.events", &events);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = read_full_file(events, &content, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
p = content;
|
||||
while ((line = strsep(&p, "\n"))) {
|
||||
char *key;
|
||||
|
||||
key = strsep(&line, " ");
|
||||
if (!key || !line)
|
||||
return -EINVAL;
|
||||
|
||||
if (strcmp(key, event))
|
||||
continue;
|
||||
|
||||
*val = strdup(line);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int cg_enumerate_subgroups(const char *controller, const char *path, DIR **_d) {
|
||||
_cleanup_free_ char *fs = NULL;
|
||||
int r;
|
||||
@@ -1007,18 +1040,12 @@ int cg_is_empty_recursive(const char *controller, const char *path) {
|
||||
return unified;
|
||||
|
||||
if (unified > 0) {
|
||||
_cleanup_free_ char *populated = NULL, *t = NULL;
|
||||
_cleanup_free_ char *t = NULL;
|
||||
|
||||
/* On the unified hierarchy we can check empty state
|
||||
* via the "cgroup.populated" attribute. */
|
||||
* via the "populated" attribute of "cgroup.events". */
|
||||
|
||||
r = cg_get_path(controller, path, "cgroup.populated", &populated);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = read_one_line_file(populated, &t);
|
||||
if (r == -ENOENT)
|
||||
return 1;
|
||||
r = cg_read_event(controller, path, "populated", &t);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -2129,7 +2156,7 @@ int cg_unified(void) {
|
||||
if (statfs("/sys/fs/cgroup/", &fs) < 0)
|
||||
return -errno;
|
||||
|
||||
if (F_TYPE_EQUAL(fs.f_type, CGROUP_SUPER_MAGIC))
|
||||
if (F_TYPE_EQUAL(fs.f_type, CGROUP2_SUPER_MAGIC))
|
||||
unified_cache = true;
|
||||
else if (F_TYPE_EQUAL(fs.f_type, TMPFS_MAGIC))
|
||||
unified_cache = false;
|
||||
|
||||
@@ -96,6 +96,8 @@ static inline bool CGROUP_BLKIO_WEIGHT_IS_OK(uint64_t x) {
|
||||
|
||||
int cg_enumerate_processes(const char *controller, const char *path, FILE **_f);
|
||||
int cg_read_pid(FILE *f, pid_t *_pid);
|
||||
int cg_read_event(const char *controller, const char *path, const char *event,
|
||||
char **val);
|
||||
|
||||
int cg_enumerate_subgroups(const char *controller, const char *path, DIR **_d);
|
||||
int cg_read_subgroup(DIR *d, char **fn);
|
||||
|
||||
@@ -437,6 +437,10 @@ struct btrfs_ioctl_quota_ctl_args {
|
||||
#define CGROUP_SUPER_MAGIC 0x27e0eb
|
||||
#endif
|
||||
|
||||
#ifndef CGROUP2_SUPER_MAGIC
|
||||
#define CGROUP2_SUPER_MAGIC 0x63677270
|
||||
#endif
|
||||
|
||||
#ifndef TMPFS_MAGIC
|
||||
#define TMPFS_MAGIC 0x01021994
|
||||
#endif
|
||||
|
||||
+3
-3
@@ -765,7 +765,7 @@ int unit_set_cgroup_path(Unit *u, const char *path) {
|
||||
}
|
||||
|
||||
int unit_watch_cgroup(Unit *u) {
|
||||
_cleanup_free_ char *populated = NULL;
|
||||
_cleanup_free_ char *events = NULL;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
@@ -791,11 +791,11 @@ int unit_watch_cgroup(Unit *u) {
|
||||
if (r < 0)
|
||||
return log_oom();
|
||||
|
||||
r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, "cgroup.populated", &populated);
|
||||
r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, "cgroup.events", &events);
|
||||
if (r < 0)
|
||||
return log_oom();
|
||||
|
||||
u->cgroup_inotify_wd = inotify_add_watch(u->manager->cgroup_inotify_fd, populated, IN_MODIFY);
|
||||
u->cgroup_inotify_wd = inotify_add_watch(u->manager->cgroup_inotify_fd, events, IN_MODIFY);
|
||||
if (u->cgroup_inotify_wd < 0) {
|
||||
|
||||
if (errno == ENOENT) /* If the directory is already
|
||||
|
||||
+3
-1
@@ -1631,7 +1631,9 @@ static void invoke_sigchld_event(Manager *m, Unit *u, const siginfo_t *si) {
|
||||
log_unit_debug(u, "Child "PID_FMT" belongs to %s", si->si_pid, u->id);
|
||||
|
||||
unit_unwatch_pid(u, si->si_pid);
|
||||
UNIT_VTABLE(u)->sigchld_event(u, si->si_pid, si->si_code, si->si_status);
|
||||
|
||||
if (UNIT_VTABLE(u)->sigchld_event)
|
||||
UNIT_VTABLE(u)->sigchld_event(u, si->si_pid, si->si_code, si->si_status);
|
||||
}
|
||||
|
||||
static int manager_dispatch_sigchld(Manager *m) {
|
||||
|
||||
@@ -94,7 +94,7 @@ static const MountPoint mount_table[] = {
|
||||
#endif
|
||||
{ "tmpfs", "/run", "tmpfs", "mode=755", MS_NOSUID|MS_NODEV|MS_STRICTATIME,
|
||||
NULL, MNT_FATAL|MNT_IN_CONTAINER },
|
||||
{ "cgroup", "/sys/fs/cgroup", "cgroup", "__DEVEL__sane_behavior", MS_NOSUID|MS_NOEXEC|MS_NODEV,
|
||||
{ "cgroup", "/sys/fs/cgroup", "cgroup2", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV,
|
||||
cg_is_unified_wanted, MNT_FATAL|MNT_IN_CONTAINER },
|
||||
{ "tmpfs", "/sys/fs/cgroup", "tmpfs", "mode=755", MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME,
|
||||
cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
|
||||
|
||||
@@ -55,8 +55,7 @@ int chown_cgroup(pid_t pid, uid_t uid_shift) {
|
||||
"cgroup.events",
|
||||
"cgroup.clone_children",
|
||||
"cgroup.controllers",
|
||||
"cgroup.subtree_control",
|
||||
"cgroup.populated")
|
||||
"cgroup.subtree_control")
|
||||
if (fchownat(fd, fn, uid_shift, uid_shift, 0) < 0)
|
||||
log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_WARNING, errno,
|
||||
"Failed to chown() cgroup file %s, ignoring: %m", fn);
|
||||
@@ -94,7 +93,7 @@ int sync_cgroup(pid_t pid, bool unified_requested) {
|
||||
if (unified)
|
||||
r = mount("cgroup", tree, "cgroup", MS_NOSUID|MS_NOEXEC|MS_NODEV, "none,name=systemd,xattr");
|
||||
else
|
||||
r = mount("cgroup", tree, "cgroup", MS_NOSUID|MS_NOEXEC|MS_NODEV, "__DEVEL__sane_behavior");
|
||||
r = mount("cgroup", tree, "cgroup2", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL);
|
||||
if (r < 0) {
|
||||
r = log_error_errno(errno, "Failed to mount unified hierarchy: %m");
|
||||
goto finish;
|
||||
|
||||
@@ -750,7 +750,7 @@ static int mount_unified_cgroups(const char *dest) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (mount("cgroup", p, "cgroup", MS_NOSUID|MS_NOEXEC|MS_NODEV, "__DEVEL__sane_behavior") < 0)
|
||||
if (mount("cgroup", p, "cgroup2", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL) < 0)
|
||||
return log_error_errno(errno, "Failed to mount unified cgroup hierarchy to %s: %m", p);
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user