mirror of
https://github.com/opencontainers/runc.git
synced 2025-11-03 09:51:06 +08:00
Apply and Set are two separate operations, and it doesn't make sense to group the two together (especially considering that the bootstrap process is added to the cgroup as well). The only exception to this is the memory cgroup, which requires the configuration to be set before processes can join. One of the weird cases to deal with is systemd. Systemd sets some of the cgroup configuration options, but not all of them. Because memory is a special case, we need to explicitly set memory in the systemd Apply(). Otherwise, the rest can be safely re-applied in .Set() as usual. Signed-off-by: Aleksa Sarai <asarai@suse.com>
58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
// +build linux
|
|
|
|
package fs
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
|
"github.com/opencontainers/runc/libcontainer/configs"
|
|
)
|
|
|
|
type PidsGroup struct {
|
|
}
|
|
|
|
func (s *PidsGroup) Name() string {
|
|
return "pids"
|
|
}
|
|
|
|
func (s *PidsGroup) Apply(d *cgroupData) error {
|
|
_, err := d.join("pids")
|
|
if err != nil && !cgroups.IsNotFound(err) {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *PidsGroup) Set(path string, cgroup *configs.Cgroup) error {
|
|
if cgroup.Resources.PidsLimit != 0 {
|
|
// "max" is the fallback value.
|
|
limit := "max"
|
|
|
|
if cgroup.Resources.PidsLimit > 0 {
|
|
limit = strconv.FormatInt(cgroup.Resources.PidsLimit, 10)
|
|
}
|
|
|
|
if err := writeFile(path, "pids.max", limit); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *PidsGroup) Remove(d *cgroupData) error {
|
|
return removePath(d.path("pids"))
|
|
}
|
|
|
|
func (s *PidsGroup) GetStats(path string, stats *cgroups.Stats) error {
|
|
value, err := getCgroupParamUint(path, "pids.current")
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse pids.current - %s", err)
|
|
}
|
|
|
|
stats.PidsStats.Current = value
|
|
return nil
|
|
}
|