Permalink
Browse files

Ignore trailing /init.scope in init cgroups

The lxc monitor does not store the container's cgroups, rather it
recalculates them whenever needed.

Systemd moves itself into a /init.scope cgroup for the systemd
controller.

It might be worth changing that (by storing all cgroup info in the
lxc_handler), but for now go the hacky route and chop off any
trailing /init.scope.

I definately thinkg we want to switch to storing as that will be
more bullet-proof, but for now we need a quick backportable fix
for systemd 226 guests.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
  • Loading branch information...
1 parent 27c278a commit f348e47c93568b4f0c371cf5df1c98d4e816a86c @hallyn hallyn committed with stgraber Oct 15, 2015
Showing with 18 additions and 0 deletions.
  1. +1 −0 src/lxc/cgfs.c
  2. +1 −0 src/lxc/cgmanager.c
  3. +14 −0 src/lxc/cgroup.c
  4. +2 −0 src/lxc/cgroup.h
View
@@ -1220,6 +1220,7 @@ static char *lxc_cgroup_get_hierarchy_path_data(const char *subsystem, struct cg
info = find_info_for_subsystem(info, subsystem);
if (!info)
return NULL;
+ prune_init_scope(info->cgroup_path);
return info->cgroup_path;
}
View
@@ -776,6 +776,7 @@ static char *try_get_abs_cgroup(const char *name, const char *lxcpath,
nerr = nih_error_get();
nih_free(nerr);
}
+ prune_init_scope(cgroup);
return cgroup;
}
View
@@ -194,3 +194,17 @@ cgroup_driver_t cgroup_driver(void)
{
return ops->driver;
}
+
+#define INIT_SCOPE "/init.scope"
+void prune_init_scope(char *cg)
+{
+ char *point = cg + strlen(cg) - strlen(INIT_SCOPE);
+ if (point < cg)
+ return;
+ if (strcmp(point, INIT_SCOPE) == 0) {
+ if (point == cg)
+ *(point+1) = '\0';
+ else
+ *point = '\0';
+ }
+}
View
@@ -80,4 +80,6 @@ extern bool cgroup_unfreeze(struct lxc_handler *handler);
extern void cgroup_disconnect(void);
extern cgroup_driver_t cgroup_driver(void);
+extern void prune_init_scope(char *cg);
+
#endif

0 comments on commit f348e47

Please sign in to comment.