...

Source file src/github.com/opencontainers/runc/libcontainer/cgroups/fs2/hugetlb.go

Documentation: github.com/opencontainers/runc/libcontainer/cgroups/fs2

     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