[systemd-devel] [PATCH] Cache aggregated cgroup mask data at the slice level.
david at davidstrauss.net
david at davidstrauss.net
Wed Nov 6 22:00:48 PST 2013
From: David Strauss <david at davidstrauss.net>
---
src/core/cgroup.c | 20 +++++++++++++++++++-
src/core/cgroup.h | 2 ++
src/core/unit.c | 2 ++
3 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 6a6c504..b75ab55 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -345,6 +345,14 @@ static CGroupControllerMask unit_get_cgroup_mask(Unit *u) {
return cgroup_context_get_mask(c);
}
+void unit_update_parent_slice_mask(Unit *u) {
+ if (UNIT_ISSET(u->slice)) {
+ UNIT_DEREF(u->slice)->cgroup_mask |= unit_get_cgroup_mask(u);
+ log_warning("Setting slice to mask: %x", unit_get_cgroup_mask(u));
+ }
+ log_warning("No slice to update.");
+}
+
static CGroupControllerMask unit_get_members_mask(Unit *u) {
CGroupControllerMask mask = 0;
Unit *m;
@@ -425,12 +433,22 @@ static int unit_realize_cgroup_now(Unit *u) {
assert(u);
+ log_warning("unit_realize_cgroup_now");
+
if (u->in_cgroup_queue) {
LIST_REMOVE(cgroup_queue, u->manager->cgroup_queue, u);
u->in_cgroup_queue = false;
}
- mask = unit_get_cgroup_mask(u) | unit_get_members_mask(u) | unit_get_siblings_mask(u);
+ /* If the unit is a member of a slice, the slice will contain
+ * aggregated cgroup mask data for the unit and all siblings. */
+ if (UNIT_ISSET(u->slice)) {
+ mask = UNIT_DEREF(u->slice)->cgroup_mask;
+ log_warning("Using cgroup_mask.");
+ } else {
+ mask = unit_get_cgroup_mask(u) | unit_get_members_mask(u) | unit_get_siblings_mask(u);
+ log_warning("Not using cgroup_mask.");
+ }
mask &= u->manager->cgroup_supported;
if (u->cgroup_realized &&
diff --git a/src/core/cgroup.h b/src/core/cgroup.h
index 0a079e9..1a24d07 100644
--- a/src/core/cgroup.h
+++ b/src/core/cgroup.h
@@ -113,3 +113,5 @@ int manager_notify_cgroup_empty(Manager *m, const char *group);
const char* cgroup_device_policy_to_string(CGroupDevicePolicy i) _const_;
CGroupDevicePolicy cgroup_device_policy_from_string(const char *s) _pure_;
+
+void unit_update_parent_slice_mask(Unit *u);
diff --git a/src/core/unit.c b/src/core/unit.c
index e19d281..a018dad 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -981,6 +981,8 @@ int unit_load(Unit *u) {
goto fail;
}
+ unit_update_parent_slice_mask(u);
+
r = unit_add_mount_links(u);
if (r < 0)
goto fail;
--
1.8.3.1
More information about the systemd-devel
mailing list