You've already forked runc
mirror of
https://github.com/opencontainers/runc.git
synced 2025-08-01 05:06:52 +03:00
1. Instead of enabling all available controllers, figure out which ones are required, and only enable those. 2. Amend all setFoo() functions to call isFooSet(). While this might seem unnecessary, it might actually help to uncover a bug. Imagine someone: - adds a cgroup.Resources.CpuFoo setting; - modifies setCpu() to apply the new setting; - but forgets to amend isCpuSet() accordingly <-- BUG In this case, a test case modifying CpuFoo will help to uncover the BUG. This is the reason why it's added. This patch *could be* amended by enabling controllers on a best-effort basis, i.e. : - do not return an error early if we can't enable some controllers; - if we fail to enable all controllers at once (usually because one of them can't be enabled), try enabling them one by one. Currently this is not implemented, and it's not clear whether this would be a good way to go or not. [v2: add/use is${Controller}Set() functions] [v3: document neededControllers()] [v4: drop "best-effort" part] Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
67 lines
1.8 KiB
Go
67 lines
1.8 KiB
Go
// +build linux
|
|
|
|
package fs2
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
|
"github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
|
|
"github.com/opencontainers/runc/libcontainer/configs"
|
|
)
|
|
|
|
func isHugeTlbSet(cgroup *configs.Cgroup) bool {
|
|
return len(cgroup.Resources.HugetlbLimit) > 0
|
|
}
|
|
|
|
func setHugeTlb(dirPath string, cgroup *configs.Cgroup) error {
|
|
if !isHugeTlbSet(cgroup) {
|
|
return nil
|
|
}
|
|
for _, hugetlb := range cgroup.Resources.HugetlbLimit {
|
|
if err := fscommon.WriteFile(dirPath, strings.Join([]string{"hugetlb", hugetlb.Pagesize, "max"}, "."), strconv.FormatUint(hugetlb.Limit, 10)); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func statHugeTlb(dirPath string, stats *cgroups.Stats) error {
|
|
hugePageSizes, err := cgroups.GetHugePageSize()
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to fetch hugetlb info")
|
|
}
|
|
hugetlbStats := cgroups.HugetlbStats{}
|
|
|
|
for _, pagesize := range hugePageSizes {
|
|
usage := strings.Join([]string{"hugetlb", pagesize, "current"}, ".")
|
|
value, err := fscommon.GetCgroupParamUint(dirPath, usage)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "failed to parse hugetlb.%s.current file", pagesize)
|
|
}
|
|
hugetlbStats.Usage = value
|
|
|
|
fileName := strings.Join([]string{"hugetlb", pagesize, "events"}, ".")
|
|
filePath := filepath.Join(dirPath, fileName)
|
|
contents, err := ioutil.ReadFile(filePath)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "failed to parse hugetlb.%s.events file", pagesize)
|
|
}
|
|
_, value, err = fscommon.GetCgroupParamKeyValue(string(contents))
|
|
if err != nil {
|
|
return errors.Wrapf(err, "failed to parse hugetlb.%s.events file", pagesize)
|
|
}
|
|
hugetlbStats.Failcnt = value
|
|
|
|
stats.HugetlbStats[pagesize] = hugetlbStats
|
|
}
|
|
|
|
return nil
|
|
}
|