From fc7de5616f6564a14d12454054f05565264bd4e1 Mon Sep 17 00:00:00 2001 From: Serge Hallyn Date: Tue, 12 Mar 2013 20:21:42 -0500 Subject: [PATCH] cgroup: try to set clone_children Signed-off-by: Serge Hallyn --- src/lxc/cgroup.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c index 4d7de02f3..2044c2b64 100644 --- a/src/lxc/cgroup.c +++ b/src/lxc/cgroup.c @@ -557,6 +557,31 @@ out: free(parentpath); } +/* + * If first creating the /sys/fs/cgroup/$subsys/lxc container, then + * try to set clone_children to 1. Some kernels don't support + * clone_children, and cgroup maintainer wants to deprecate it. So + * XXX TODO we should instead after each cgroup mkdir (here and in + * hooks/mountcgroup) check if cpuset is in the subsystems, and if so + * manually copy over mems and cpus. + */ +static void set_clone_children(const char *mntdir, const char *init) +{ + char path[MAXPATHLEN]; + FILE *fout; + int ret; + + ret = snprintf(path, MAXPATHLEN, "%s%s/cgroup.clone_children", mntdir, init); + INFO("writing to %s\n", path); + if (ret < 0 || ret > MAXPATHLEN) + return; + fout = fopen(path, "w"); + if (!fout) + return; + fprintf(fout, "1\n"); + fclose(fout); +} + /* * Make sure the 'cgroup group' exists, so that we don't have to worry about * that later. @@ -597,6 +622,7 @@ static int create_lxcgroups(const char *lxcgroup) if (ret < 0 || ret >= MAXPATHLEN) goto fail; if (access(path, F_OK)) { + set_clone_children(mntent->mnt_dir, init); ret = mkdir(path, 0755); if (ret == -1 && errno != EEXIST) { SYSERROR("failed to create '%s' directory", path);