...
1 package fs2
2
3 import (
4 "errors"
5 "os"
6 "strconv"
7
8 "github.com/opencontainers/runc/libcontainer/cgroups"
9 "github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
10 "github.com/opencontainers/runc/libcontainer/configs"
11 )
12
13 func isHugeTlbSet(r *configs.Resources) bool {
14 return len(r.HugetlbLimit) > 0
15 }
16
17 func setHugeTlb(dirPath string, r *configs.Resources) error {
18 if !isHugeTlbSet(r) {
19 return nil
20 }
21 const suffix = ".max"
22 skipRsvd := false
23 for _, hugetlb := range r.HugetlbLimit {
24 prefix := "hugetlb." + hugetlb.Pagesize
25 val := strconv.FormatUint(hugetlb.Limit, 10)
26 if err := cgroups.WriteFile(dirPath, prefix+suffix, val); err != nil {
27 return err
28 }
29 if skipRsvd {
30 continue
31 }
32 if err := cgroups.WriteFile(dirPath, prefix+".rsvd"+suffix, val); err != nil {
33 if errors.Is(err, os.ErrNotExist) {
34 skipRsvd = true
35 continue
36 }
37 return err
38 }
39 }
40
41 return nil
42 }
43
44 func statHugeTlb(dirPath string, stats *cgroups.Stats) error {
45 hugetlbStats := cgroups.HugetlbStats{}
46 rsvd := ".rsvd"
47 for _, pagesize := range cgroups.HugePageSizes() {
48 again:
49 prefix := "hugetlb." + pagesize + rsvd
50 value, err := fscommon.GetCgroupParamUint(dirPath, prefix+".current")
51 if err != nil {
52 if rsvd != "" && errors.Is(err, os.ErrNotExist) {
53 rsvd = ""
54 goto again
55 }
56 return err
57 }
58 hugetlbStats.Usage = value
59
60 value, err = fscommon.GetValueByKey(dirPath, prefix+".events", "max")
61 if err != nil {
62 return err
63 }
64 hugetlbStats.Failcnt = value
65
66 stats.HugetlbStats[pagesize] = hugetlbStats
67 }
68
69 return nil
70 }
71
View as plain text