mirror of
https://github.com/systemd/systemd.git
synced 2024-11-02 10:51:20 +03:00
core: update populated event handling in unified hierarchy
Earlier during the development of unified hierarchy, the populated event was reported through by the dedicated "cgroup.populated" file; however, the interface was updated so that it's reported through the "populated" field of "cgroup.events" file. Update populated event handling logic accordingly.
This commit is contained in:
parent
099619957a
commit
ab2c3861dc
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user