mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
3f65946756
A cgroup manager's Set method sets cgroup resources, but historically it was accepting configs.Cgroups. Refactor it to accept resources only. This is an improvement from the API point of view, as the method can not change cgroup configuration (such as path to the cgroup etc), it can only set (modify) its resources/limits. This also lays the foundation for complicated resource updates, as now Set has two sets of resources -- the one that was previously specified during cgroup manager creation (or the previous Set), and the one passed in the argument, so it could deduce the difference between these. This is a long term goal though. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
// +build linux
|
|
|
|
package fs2
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"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(r *configs.Resources) bool {
|
|
return len(r.HugetlbLimit) > 0
|
|
}
|
|
|
|
func setHugeTlb(dirPath string, r *configs.Resources) error {
|
|
if !isHugeTlbSet(r) {
|
|
return nil
|
|
}
|
|
for _, hugetlb := range r.HugetlbLimit {
|
|
if err := fscommon.WriteFile(dirPath, "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 {
|
|
value, err := fscommon.GetCgroupParamUint(dirPath, "hugetlb."+pagesize+".current")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
hugetlbStats.Usage = value
|
|
|
|
fileName := "hugetlb." + pagesize + ".events"
|
|
value, err = fscommon.GetValueByKey(dirPath, fileName, "max")
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to read stats")
|
|
}
|
|
hugetlbStats.Failcnt = value
|
|
|
|
stats.HugetlbStats[pagesize] = hugetlbStats
|
|
}
|
|
|
|
return nil
|
|
}
|