mirror of
https://github.com/opencontainers/runc.git
synced 2025-10-25 00:20:47 +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>
72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
// +build linux
|
|
|
|
package fs
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
|
"github.com/opencontainers/runc/libcontainer/configs"
|
|
)
|
|
|
|
type HugetlbGroup struct {
|
|
}
|
|
|
|
func (s *HugetlbGroup) Name() string {
|
|
return "hugetlb"
|
|
}
|
|
|
|
func (s *HugetlbGroup) Apply(d *cgroupData) error {
|
|
_, err := d.join("hugetlb")
|
|
if err != nil && !cgroups.IsNotFound(err) {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *HugetlbGroup) Set(path string, cgroup *configs.Cgroup) error {
|
|
for _, hugetlb := range cgroup.Resources.HugetlbLimit {
|
|
if err := writeFile(path, strings.Join([]string{"hugetlb", hugetlb.Pagesize, "limit_in_bytes"}, "."), strconv.FormatUint(hugetlb.Limit, 10)); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *HugetlbGroup) Remove(d *cgroupData) error {
|
|
return removePath(d.path("hugetlb"))
|
|
}
|
|
|
|
func (s *HugetlbGroup) GetStats(path string, stats *cgroups.Stats) error {
|
|
hugetlbStats := cgroups.HugetlbStats{}
|
|
for _, pageSize := range HugePageSizes {
|
|
usage := strings.Join([]string{"hugetlb", pageSize, "usage_in_bytes"}, ".")
|
|
value, err := getCgroupParamUint(path, usage)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse %s - %v", usage, err)
|
|
}
|
|
hugetlbStats.Usage = value
|
|
|
|
maxUsage := strings.Join([]string{"hugetlb", pageSize, "max_usage_in_bytes"}, ".")
|
|
value, err = getCgroupParamUint(path, maxUsage)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse %s - %v", maxUsage, err)
|
|
}
|
|
hugetlbStats.MaxUsage = value
|
|
|
|
failcnt := strings.Join([]string{"hugetlb", pageSize, "failcnt"}, ".")
|
|
value, err = getCgroupParamUint(path, failcnt)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse %s - %v", failcnt, err)
|
|
}
|
|
hugetlbStats.Failcnt = value
|
|
|
|
stats.HugetlbStats[pageSize] = hugetlbStats
|
|
}
|
|
|
|
return nil
|
|
}
|