summaryrefslogtreecommitdiff
path: root/src/basic
diff options
context:
space:
mode:
authorSven Eden <yamakuzure@gmx.net>2017-01-26 08:30:04 +0100
committerSven Eden <yamakuzure@gmx.net>2017-03-14 10:23:04 +0100
commitfaf2e887be42215c1999950d16d1975e70bbdfe9 (patch)
treec2b75d145a54baa856dae41673d2d02e0db25848 /src/basic
parent56c4f5eceb1e77ac537960e255076712fcd0e7e5 (diff)
[Patch 3/3] Add cgroups initialization and handling
Let elogind setup cgroups support on its manager initialization and free the cgroups subsystem when the manager is destroyed.
Diffstat (limited to 'src/basic')
-rw-r--r--src/basic/cgroup-util.c24
-rw-r--r--src/basic/cgroup-util.h10
-rw-r--r--src/basic/def.h2
3 files changed, 21 insertions, 15 deletions
diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c
index 08259fcfc..95f6faf81 100644
--- a/src/basic/cgroup-util.c
+++ b/src/basic/cgroup-util.c
@@ -668,8 +668,6 @@ int cg_create(const char *controller, const char *path) {
return 1;
}
-/// UNNEEDED by elogind
-#if 0
int cg_create_and_attach(const char *controller, const char *path, pid_t pid) {
int r, q;
@@ -686,7 +684,6 @@ int cg_create_and_attach(const char *controller, const char *path, pid_t pid) {
/* This does not remove the cgroup on failure */
return r;
}
-#endif // 0
int cg_attach(const char *controller, const char *path, pid_t pid) {
_cleanup_free_ char *fs = NULL;
@@ -879,8 +876,6 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) {
return -ENODATA;
}
-/// UNNEEDED by elogind
-#if 0
int cg_install_release_agent(const char *controller, const char *agent) {
_cleanup_free_ char *fs = NULL, *contents = NULL;
const char *sc;
@@ -965,7 +960,6 @@ int cg_uninstall_release_agent(const char *controller) {
return 0;
}
-#endif // 0
int cg_is_empty(const char *controller, const char *path) {
_cleanup_fclose_ FILE *f = NULL;
@@ -1810,6 +1804,7 @@ int cg_slice_to_path(const char *unit, char **ret) {
return 0;
}
+#endif // 0
int cg_set_attribute(const char *controller, const char *path, const char *attribute, const char *value) {
_cleanup_free_ char *p = NULL;
@@ -1822,6 +1817,8 @@ int cg_set_attribute(const char *controller, const char *path, const char *attri
return write_string_file_no_create(p, value);
}
+/// UNNEEDED by elogind
+#if 0
int cg_get_attribute(const char *controller, const char *path, const char *attribute, char **ret) {
_cleanup_free_ char *p = NULL;
int r;
@@ -1832,10 +1829,7 @@ int cg_get_attribute(const char *controller, const char *path, const char *attri
return read_one_line_file(p, ret);
}
-#endif // 0
-/// UNNEEDED by elogind
-#if 0
int cg_create_everywhere(CGroupMask supported, CGroupMask mask, const char *path) {
CGroupController c;
int r, unified;
@@ -1985,6 +1979,7 @@ int cg_trim_everywhere(CGroupMask supported, const char *path, bool delete_root)
return 0;
}
+#endif // 0
int cg_mask_supported(CGroupMask *ret) {
CGroupMask mask = 0;
@@ -2058,6 +2053,8 @@ int cg_mask_supported(CGroupMask *ret) {
return 0;
}
+/// UNNEEDED by elogind
+#if 0
int cg_kernel_controllers(Set *controllers) {
_cleanup_fclose_ FILE *f = NULL;
char buf[LINE_MAX];
@@ -2131,9 +2128,18 @@ int cg_unified(void) {
if (statfs("/sys/fs/cgroup/", &fs) < 0)
return -errno;
+/// elogind can not support the unified hierarchy as a controller,
+/// so always assume a classical hierarchy.
+/// If, ond only *if*, someone really wants to substitute systemd-login
+/// in an environment managed by systemd with elogin, we might have to
+/// add such a support.
+#if 0
if (F_TYPE_EQUAL(fs.f_type, CGROUP_SUPER_MAGIC))
unified_cache = true;
else if (F_TYPE_EQUAL(fs.f_type, TMPFS_MAGIC))
+#else
+ if (F_TYPE_EQUAL(fs.f_type, TMPFS_MAGIC))
+#endif // elogind
unified_cache = false;
else
return -ENOEXEC;
diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h
index e1cbd6cd1..8fa1e9f82 100644
--- a/src/basic/cgroup-util.h
+++ b/src/basic/cgroup-util.h
@@ -94,16 +94,16 @@ int cg_rmdir(const char *controller, const char *path);
int cg_create(const char *controller, const char *path);
int cg_attach(const char *controller, const char *path, pid_t pid);
int cg_attach_fallback(const char *controller, const char *path, pid_t pid);
-// UNNEEDED int cg_create_and_attach(const char *controller, const char *path, pid_t pid);
+int cg_create_and_attach(const char *controller, const char *path, pid_t pid);
-// UNNEEDED int cg_set_attribute(const char *controller, const char *path, const char *attribute, const char *value);
+int cg_set_attribute(const char *controller, const char *path, const char *attribute, const char *value);
// UNNEEDED int cg_get_attribute(const char *controller, const char *path, const char *attribute, char **ret);
// UNNEEDED int cg_set_group_access(const char *controller, const char *path, mode_t mode, uid_t uid, gid_t gid);
// UNNEEDED int cg_set_task_access(const char *controller, const char *path, mode_t mode, uid_t uid, gid_t gid);
-// UNNEEDED int cg_install_release_agent(const char *controller, const char *agent);
-// UNNEEDED int cg_uninstall_release_agent(const char *controller);
+int cg_install_release_agent(const char *controller, const char *agent);
+int cg_uninstall_release_agent(const char *controller);
int cg_is_empty(const char *controller, const char *path);
int cg_is_empty_recursive(const char *controller, const char *path);
@@ -147,7 +147,7 @@ int cg_attach_everywhere(CGroupMask supported, const char *path, pid_t pid, cg_m
// UNNEEDED int cg_trim_everywhere(CGroupMask supported, const char *path, bool delete_root);
// UNNEEDED int cg_enable_everywhere(CGroupMask supported, CGroupMask mask, const char *p);
-// UNNEEDED int cg_mask_supported(CGroupMask *ret);
+int cg_mask_supported(CGroupMask *ret);
// UNNEEDED int cg_kernel_controllers(Set *controllers);
diff --git a/src/basic/def.h b/src/basic/def.h
index a6bd34c9d..00f9f2f94 100644
--- a/src/basic/def.h
+++ b/src/basic/def.h
@@ -35,7 +35,7 @@
* the watchdog pings will keep the loop busy. */
#define DEFAULT_EXIT_USEC (30*USEC_PER_SEC)
-#define ELOGIND_CGROUP_CONTROLLER "elogind"
+#define ELOGIND_CGROUP_CONTROLLER "name=elogind"
#define SIGNALS_CRASH_HANDLER SIGSEGV,SIGILL,SIGFPE,SIGBUS,SIGQUIT,SIGABRT
#define SIGNALS_IGNORE SIGPIPE