hugetlb.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // +build linux
  2. package fs
  3. import (
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. "github.com/opencontainers/runc/libcontainer/cgroups"
  8. "github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
  9. "github.com/opencontainers/runc/libcontainer/configs"
  10. )
  11. type HugetlbGroup struct {
  12. }
  13. func (s *HugetlbGroup) Name() string {
  14. return "hugetlb"
  15. }
  16. func (s *HugetlbGroup) Apply(d *cgroupData) error {
  17. _, err := d.join("hugetlb")
  18. if err != nil && !cgroups.IsNotFound(err) {
  19. return err
  20. }
  21. return nil
  22. }
  23. func (s *HugetlbGroup) Set(path string, cgroup *configs.Cgroup) error {
  24. for _, hugetlb := range cgroup.Resources.HugetlbLimit {
  25. if err := fscommon.WriteFile(path, strings.Join([]string{"hugetlb", hugetlb.Pagesize, "limit_in_bytes"}, "."), strconv.FormatUint(hugetlb.Limit, 10)); err != nil {
  26. return err
  27. }
  28. }
  29. return nil
  30. }
  31. func (s *HugetlbGroup) Remove(d *cgroupData) error {
  32. return removePath(d.path("hugetlb"))
  33. }
  34. func (s *HugetlbGroup) GetStats(path string, stats *cgroups.Stats) error {
  35. hugetlbStats := cgroups.HugetlbStats{}
  36. for _, pageSize := range HugePageSizes {
  37. usage := strings.Join([]string{"hugetlb", pageSize, "usage_in_bytes"}, ".")
  38. value, err := fscommon.GetCgroupParamUint(path, usage)
  39. if err != nil {
  40. return fmt.Errorf("failed to parse %s - %v", usage, err)
  41. }
  42. hugetlbStats.Usage = value
  43. maxUsage := strings.Join([]string{"hugetlb", pageSize, "max_usage_in_bytes"}, ".")
  44. value, err = fscommon.GetCgroupParamUint(path, maxUsage)
  45. if err != nil {
  46. return fmt.Errorf("failed to parse %s - %v", maxUsage, err)
  47. }
  48. hugetlbStats.MaxUsage = value
  49. failcnt := strings.Join([]string{"hugetlb", pageSize, "failcnt"}, ".")
  50. value, err = fscommon.GetCgroupParamUint(path, failcnt)
  51. if err != nil {
  52. return fmt.Errorf("failed to parse %s - %v", failcnt, err)
  53. }
  54. hugetlbStats.Failcnt = value
  55. stats.HugetlbStats[pageSize] = hugetlbStats
  56. }
  57. return nil
  58. }