From f285d5b3e8eeea7d85e143d845e85a4d4e4c936a Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Tue, 3 Jan 2017 14:54:30 +0100 Subject: [PATCH] do not create init-dir if not needed commit 56f77d5ade945b3b8816a6c8acb328b7c6dce9a7 added support for cpu-rt-period and cpu-rt-runtime, but always initialized the cgroup path, even if not used. As a result, containers failed to start on a read-only filesystem. This patch only creates the cgroup path if one of these options is set. Signed-off-by: Sebastiaan van Stijn --- daemon/daemon_unix.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/daemon/daemon_unix.go b/daemon/daemon_unix.go index e8efb95be3..6fb75c7c8e 100644 --- a/daemon/daemon_unix.go +++ b/daemon/daemon_unix.go @@ -1190,6 +1190,12 @@ func (daemon *Daemon) initCgroupsPath(path string) error { return nil } + if daemon.configStore.CPURealtimePeriod == 0 && daemon.configStore.CPURealtimeRuntime == 0 { + return nil + } + + // Recursively create cgroup to ensure that the system and all parent cgroups have values set + // for the period and runtime as this limits what the children can be set to. daemon.initCgroupsPath(filepath.Dir(path)) _, root, err := cgroups.FindCgroupMountpointAndRoot("cpu") @@ -1199,15 +1205,18 @@ func (daemon *Daemon) initCgroupsPath(path string) error { path = filepath.Join(root, path) sysinfo := sysinfo.New(true) - if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) { - return err - } if sysinfo.CPURealtimePeriod && daemon.configStore.CPURealtimePeriod != 0 { + if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) { + return err + } if err := ioutil.WriteFile(filepath.Join(path, "cpu.rt_period_us"), []byte(strconv.FormatInt(daemon.configStore.CPURealtimePeriod, 10)), 0700); err != nil { return err } } if sysinfo.CPURealtimeRuntime && daemon.configStore.CPURealtimeRuntime != 0 { + if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) { + return err + } if err := ioutil.WriteFile(filepath.Join(path, "cpu.rt_runtime_us"), []byte(strconv.FormatInt(daemon.configStore.CPURealtimeRuntime, 10)), 0700); err != nil { return err }