github.com/opencontainers/runc@v1.2.0-rc.1.0.20240520010911-492dc558cdd6/libcontainer/cgroups/fs2/hugetlb.go (about) 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 }