mirror of
https://github.com/systemd/systemd.git
synced 2025-02-25 21:57:32 +03:00
manager: remove unavailable/redundant entries from default controllers list
This commit is contained in:
parent
3474ae3c7e
commit
9156e799a2
@ -30,6 +30,7 @@
|
|||||||
#include "cgroup.h"
|
#include "cgroup.h"
|
||||||
#include "cgroup-util.h"
|
#include "cgroup-util.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "strv.h"
|
||||||
|
|
||||||
int cgroup_bonding_realize(CGroupBonding *b) {
|
int cgroup_bonding_realize(CGroupBonding *b) {
|
||||||
int r;
|
int r;
|
||||||
@ -305,7 +306,8 @@ int manager_setup_cgroup(Manager *m) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 1. Determine hierarchy */
|
/* 1. Determine hierarchy */
|
||||||
if ((r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 0, ¤t)) < 0) {
|
r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 0, ¤t);
|
||||||
|
if (r < 0) {
|
||||||
log_error("Cannot determine cgroup we are running in: %s", strerror(-r));
|
log_error("Cannot determine cgroup we are running in: %s", strerror(-r));
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
@ -352,7 +354,8 @@ int manager_setup_cgroup(Manager *m) {
|
|||||||
log_debug("Release agent already installed.");
|
log_debug("Release agent already installed.");
|
||||||
|
|
||||||
/* 4. Realize the group */
|
/* 4. Realize the group */
|
||||||
if ((r = cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_hierarchy, 0)) < 0) {
|
r = cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_hierarchy, 0);
|
||||||
|
if (r < 0) {
|
||||||
log_error("Failed to create root cgroup hierarchy: %s", strerror(-r));
|
log_error("Failed to create root cgroup hierarchy: %s", strerror(-r));
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
@ -361,7 +364,8 @@ int manager_setup_cgroup(Manager *m) {
|
|||||||
if (m->pin_cgroupfs_fd >= 0)
|
if (m->pin_cgroupfs_fd >= 0)
|
||||||
close_nointr_nofail(m->pin_cgroupfs_fd);
|
close_nointr_nofail(m->pin_cgroupfs_fd);
|
||||||
|
|
||||||
if ((m->pin_cgroupfs_fd = open(path, O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOCTTY|O_NONBLOCK)) < 0) {
|
m->pin_cgroupfs_fd = open(path, O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOCTTY|O_NONBLOCK);
|
||||||
|
if (r < 0) {
|
||||||
log_error("Failed to open pin file: %m");
|
log_error("Failed to open pin file: %m");
|
||||||
r = -errno;
|
r = -errno;
|
||||||
goto finish;
|
goto finish;
|
||||||
@ -369,6 +373,8 @@ int manager_setup_cgroup(Manager *m) {
|
|||||||
|
|
||||||
log_debug("Created root group.");
|
log_debug("Created root group.");
|
||||||
|
|
||||||
|
manager_shorten_default_controllers(m);
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
free(current);
|
free(current);
|
||||||
free(path);
|
free(path);
|
||||||
@ -391,6 +397,35 @@ void manager_shutdown_cgroup(Manager *m, bool delete) {
|
|||||||
m->cgroup_hierarchy = NULL;
|
m->cgroup_hierarchy = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void manager_shorten_default_controllers(Manager *m) {
|
||||||
|
char **f, **t;
|
||||||
|
|
||||||
|
strv_uniq(m->default_controllers);
|
||||||
|
|
||||||
|
if (!m->default_controllers)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (f = m->default_controllers, t = m->default_controllers; *f; f++) {
|
||||||
|
|
||||||
|
if (!streq(*f, "systemd") && !streq(*f, "name=systemd")) {
|
||||||
|
char *cc;
|
||||||
|
|
||||||
|
cc = alloca(sizeof("/sys/fs/cgroup/") + strlen(*f));
|
||||||
|
strcpy(stpcpy(cc, "/sys/fs/cgroup/"), *f);
|
||||||
|
|
||||||
|
if (access(cc, F_OK) >= 0) {
|
||||||
|
*(t++) = *f;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug("Controller %s not available or redundant, removing from default controllers list.", *f);
|
||||||
|
free(*f);
|
||||||
|
}
|
||||||
|
|
||||||
|
*t = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int cgroup_bonding_get(Manager *m, const char *cgroup, CGroupBonding **bonding) {
|
int cgroup_bonding_get(Manager *m, const char *cgroup, CGroupBonding **bonding) {
|
||||||
CGroupBonding *b;
|
CGroupBonding *b;
|
||||||
char *p;
|
char *p;
|
||||||
|
@ -85,6 +85,7 @@ pid_t cgroup_bonding_search_main_pid_list(CGroupBonding *b);
|
|||||||
|
|
||||||
int manager_setup_cgroup(Manager *m);
|
int manager_setup_cgroup(Manager *m);
|
||||||
void manager_shutdown_cgroup(Manager *m, bool delete);
|
void manager_shutdown_cgroup(Manager *m, bool delete);
|
||||||
|
void manager_shorten_default_controllers(Manager *m);
|
||||||
|
|
||||||
int cgroup_bonding_get(Manager *m, const char *cgroup, CGroupBonding **bonding);
|
int cgroup_bonding_get(Manager *m, const char *cgroup, CGroupBonding **bonding);
|
||||||
int cgroup_notify_empty(Manager *m, const char *group);
|
int cgroup_notify_empty(Manager *m, const char *group);
|
||||||
|
@ -3165,12 +3165,15 @@ int manager_set_default_controllers(Manager *m, char **controllers) {
|
|||||||
|
|
||||||
assert(m);
|
assert(m);
|
||||||
|
|
||||||
if (!(l = strv_copy(controllers)))
|
l = strv_copy(controllers);
|
||||||
|
if (!l)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
strv_free(m->default_controllers);
|
strv_free(m->default_controllers);
|
||||||
m->default_controllers = l;
|
m->default_controllers = l;
|
||||||
|
|
||||||
|
manager_shorten_default_controllers(m);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user