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 }