func (s *MemoryGroup) Apply(d *cgroupData) (err error) { path, err := d.path("memory") if err != nil && !cgroups.IsNotFound(err) { return err } if memoryAssigned(d.config) { if path != "" { if err := os.MkdirAll(path, 0755); err != nil { return err } } if err := s.Set(path, d.config); err != nil { return err } } defer func() { if err != nil { os.RemoveAll(path) } }() // We need to join memory cgroup after set memory limits, because // kmem.limit_in_bytes can only be set when the cgroup is empty. _, err = d.join("memory") if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (s *MemoryGroup) Apply(d *cgroupData) (err error) { path, err := d.path("memory") if err != nil && !cgroups.IsNotFound(err) { return err } if memoryAssigned(d.config) { if path != "" { if err := os.MkdirAll(path, 0755); err != nil { return err } } // We have to set kernel memory here, as we can't change it once // processes have been attached. if err := s.SetKernelMemory(path, d.config); err != nil { return err } } defer func() { if err != nil { os.RemoveAll(path) } }() // We need to join memory cgroup after set memory limits, because // kmem.limit_in_bytes can only be set when the cgroup is empty. _, err = d.join("memory") if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (m *Manager) Apply(pid int) (err error) { if m.Cgroups == nil { return nil } var c = m.Cgroups d, err := getCgroupData(m.Cgroups, pid) if err != nil { return err } if c.Paths != nil { paths := make(map[string]string) for name, path := range c.Paths { _, err := d.path(name) if err != nil { if cgroups.IsNotFound(err) { continue } return err } paths[name] = path } m.Paths = paths return cgroups.EnterPid(m.Paths, pid) } paths := make(map[string]string) defer func() { if err != nil { cgroups.RemovePaths(paths) } }() for _, sys := range subsystems { if err := sys.Apply(d); err != nil { return err } // TODO: Apply should, ideally, be reentrant or be broken up into a separate // create and join phase so that the cgroup hierarchy for a container can be // created then join consists of writing the process pids to cgroup.procs p, err := d.path(sys.Name()) if err != nil { if cgroups.IsNotFound(err) { continue } return err } paths[sys.Name()] = p } m.Paths = paths return nil }
func (m *Manager) Apply(pid int) (err error) { if m.Cgroups == nil { return nil } var c = m.Cgroups d, err := getCgroupData(m.Cgroups, pid) if err != nil { return err } if c.Paths != nil { paths := make(map[string]string) for name, path := range c.Paths { _, err := d.path(name) if err != nil { if cgroups.IsNotFound(err) { continue } return err } paths[name] = path } m.Paths = paths return cgroups.EnterPid(m.Paths, pid) } m.mu.Lock() defer m.mu.Unlock() paths := make(map[string]string) for _, sys := range subsystems { if err := sys.Apply(d); err != nil { return err } // TODO: Apply should, ideally, be reentrant or be broken up into a separate // create and join phase so that the cgroup hierarchy for a container can be // created then join consists of writing the process pids to cgroup.procs p, err := d.path(sys.Name()) if err != nil { // The non-presence of the devices subsystem is // considered fatal for security reasons. if cgroups.IsNotFound(err) && sys.Name() != "devices" { continue } return err } paths[sys.Name()] = p } m.Paths = paths return nil }
func joinNetPrio(c *configs.Cgroup, pid int) error { _, err := join(c, "net_prio", pid) if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (s *FreezerGroup) Apply(d *cgroupData) error { _, err := d.join("freezer") if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (m *Manager) Set(container *configs.Config) error { for _, sys := range subsystems { // We can't set this here, because after being applied, memcg doesn't // allow a non-empty cgroup from having its limits changed. if sys.Name() == "memory" { continue } // Generate fake cgroup data. d, err := getCgroupData(container.Cgroups, -1) if err != nil { return err } // Get the path, but don't error out if the cgroup wasn't found. path, err := d.path(sys.Name()) if err != nil && !cgroups.IsNotFound(err) { return err } if err := sys.Set(path, container.Cgroups); err != nil { return err } } if m.Paths["cpu"] != "" { if err := CheckCpushares(m.Paths["cpu"], container.Cgroups.Resources.CpuShares); err != nil { return err } } return nil }
func (s *PerfEventGroup) Apply(d *cgroupData) error { // we just want to join this group even though we don't set anything if _, err := d.join("perf_event"); err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (s *MemoryGroup) Apply(d *data) error { path, err := d.path("memory") if err != nil && !cgroups.IsNotFound(err) { return err } if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) { return err } if err := s.Set(path, d.c); err != nil { return err } // We need to join memory cgroup after set memory limits, because // kmem.limit_in_bytes can only be set when the cgroup is empty. _, err = d.join("memory") if err != nil { return err } defer func() { if err != nil { os.RemoveAll(path) } }() return nil }
func joinPerfEvent(c *configs.Cgroup, pid int) error { _, err := join(c, "perf_event", pid) if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func joinHugetlb(c *configs.Cgroup, pid int) error { _, err := join(c, "hugetlb", pid) if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func joinPids(c *configs.Cgroup, pid int) error { _, err := join(c, "pids", pid) if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (s *NetClsGroup) Apply(d *cgroupData) error { _, err := d.join("net_cls") if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func joinFreezer(c *configs.Cgroup, pid int) error { _, err := join(c, "freezer", pid) if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (s *PidsGroup) Apply(d *cgroupData) error { _, err := d.join("pids") if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (s *BlkioGroup) Apply(d *cgroupData) error { _, err := d.join("blkio") if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (m *Manager) Set(container *configs.Config) error { // If Paths are set, then we are just joining cgroups paths // and there is no need to set any values. if m.Cgroups.Paths != nil { return nil } for _, sys := range subsystems { // Get the subsystem path, but don't error out for not found cgroups. path, err := getSubsystemPath(container.Cgroups, sys.Name()) if err != nil && !cgroups.IsNotFound(err) { return err } if err := sys.Set(path, container.Cgroups); err != nil { return err } } if m.Paths["cpu"] != "" { if err := fs.CheckCpushares(m.Paths["cpu"], container.Cgroups.Resources.CpuShares); err != nil { return err } } return nil }
func (s *HugetlbGroup) Apply(d *cgroupData) error { _, err := d.join("hugetlb") if err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (s *CpusetGroup) Apply(d *cgroupData) error { dir, err := d.path("cpuset") if err != nil && !cgroups.IsNotFound(err) { return err } return s.ApplyDir(dir, d.config, d.pid) }
func joinMemory(c *configs.Cgroup, pid int) error { path, err := getSubsystemPath(c, "memory") if err != nil && !cgroups.IsNotFound(err) { return err } // -1 disables memoryswap if c.MemorySwap > 0 { err = writeFile(path, "memory.memsw.limit_in_bytes", strconv.FormatInt(c.MemorySwap, 10)) if err != nil { return err } } if c.OomKillDisable { if err := writeFile(path, "memory.oom_control", "1"); err != nil { return err } } if c.MemorySwappiness >= 0 && c.MemorySwappiness <= 100 { err = writeFile(path, "memory.swappiness", strconv.FormatInt(c.MemorySwappiness, 10)) if err != nil { return err } } else if c.MemorySwappiness == -1 { return nil } else { return fmt.Errorf("invalid value:%d. valid memory swappiness range is 0-100", c.MemorySwappiness) } return nil }
func joinCpu(c *configs.Cgroup, pid int) error { path, err := getSubsystemPath(c, "cpu") if err != nil && !cgroups.IsNotFound(err) { return err } if c.CpuQuota != 0 { if err = writeFile(path, "cpu.cfs_quota_us", strconv.FormatInt(c.CpuQuota, 10)); err != nil { return err } } if c.CpuPeriod != 0 { if err = writeFile(path, "cpu.cfs_period_us", strconv.FormatInt(c.CpuPeriod, 10)); err != nil { return err } } if c.CpuRtPeriod != 0 { if err = writeFile(path, "cpu.rt_period_us", strconv.FormatInt(c.CpuRtPeriod, 10)); err != nil { return err } } if c.CpuRtRuntime != 0 { if err = writeFile(path, "cpu.rt_runtime_us", strconv.FormatInt(c.CpuRtRuntime, 10)); err != nil { return err } } return nil }
func (m *Manager) Set(container *configs.Config) error { for _, sys := range subsystems { // Generate fake cgroup data. d, err := getCgroupData(container.Cgroups, -1) if err != nil { return err } // Get the path, but don't error out if the cgroup wasn't found. path, err := d.path(sys.Name()) if err != nil && !cgroups.IsNotFound(err) { return err } if err := sys.Set(path, container.Cgroups); err != nil { return err } } if m.Paths["cpu"] != "" { if err := CheckCpushares(m.Paths["cpu"], container.Cgroups.Resources.CpuShares); err != nil { return err } } return nil }
func (s *CpuacctGroup) Apply(d *data) error { // we just want to join this group even though we don't set anything if _, err := d.join("cpuacct"); err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func setKernelMemory(c *configs.Cgroup) error { path, err := getSubsystemPath(c, "memory") if err != nil && !cgroups.IsNotFound(err) { return err } return os.MkdirAll(path, 0755) }
func joinHugetlb(c *configs.Cgroup, pid int) error { path, err := join(c, "hugetlb", pid) if err != nil && !cgroups.IsNotFound(err) { return err } hugetlb := subsystems["hugetlb"] return hugetlb.Set(path, c) }
func joinNetCls(c *configs.Cgroup, pid int) error { path, err := join(c, "net_cls", pid) if err != nil && !cgroups.IsNotFound(err) { return err } netcls := subsystems["net_cls"] return netcls.Set(path, c) }
func joinNetPrio(c *configs.Cgroup, pid int) error { path, err := join(c, "net_prio", pid) if err != nil && !cgroups.IsNotFound(err) { return err } netPrio := subsystems["net_prio"] return netPrio.Set(path, c) }
func joinFreezer(c *configs.Cgroup, pid int) error { path, err := join(c, "freezer", pid) if err != nil && !cgroups.IsNotFound(err) { return err } freezer := subsystems["freezer"] return freezer.Set(path, c) }
func (s *CpuGroup) Apply(d *cgroupData) error { // We always want to join the cpu group, to allow fair cpu scheduling // on a container basis path, err := d.path("cpu") if err != nil && !cgroups.IsNotFound(err) { return err } return s.ApplyDir(path, d.config, d.pid) }
func (s *CpuGroup) Apply(d *cgroupData) error { // We always want to join the cpu group, to allow fair cpu scheduling // on a container basis _, err := d.join("cpu") if err != nil && !cgroups.IsNotFound(err) { return err } return nil }