You've already forked runc
mirror of
https://github.com/opencontainers/runc.git
synced 2025-07-30 17:43:06 +03:00
This (and the converting function) is only used by one of the four cgroup drivers. The other three do some checking and conversion in place, so let the fs2 do the same. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
// +build linux
|
|
|
|
package fs2
|
|
|
|
import (
|
|
"bufio"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
|
"github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
|
|
"github.com/opencontainers/runc/libcontainer/configs"
|
|
)
|
|
|
|
func isCpuSet(cgroup *configs.Cgroup) bool {
|
|
return cgroup.Resources.CpuWeight != 0 || cgroup.Resources.CpuQuota != 0 || cgroup.Resources.CpuPeriod != 0
|
|
}
|
|
|
|
func setCpu(dirPath string, cgroup *configs.Cgroup) error {
|
|
if !isCpuSet(cgroup) {
|
|
return nil
|
|
}
|
|
r := cgroup.Resources
|
|
|
|
// NOTE: .CpuShares is not used here. Conversion is the caller's responsibility.
|
|
if r.CpuWeight != 0 {
|
|
if err := fscommon.WriteFile(dirPath, "cpu.weight", strconv.FormatUint(r.CpuWeight, 10)); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if r.CpuQuota != 0 || r.CpuPeriod != 0 {
|
|
str := "max"
|
|
if r.CpuQuota > 0 {
|
|
str = strconv.FormatInt(r.CpuQuota, 10)
|
|
}
|
|
period := r.CpuPeriod
|
|
if period == 0 {
|
|
// This default value is documented in
|
|
// https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html
|
|
period = 100000
|
|
}
|
|
str += " " + strconv.FormatUint(period, 10)
|
|
if err := fscommon.WriteFile(dirPath, "cpu.max", str); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
func statCpu(dirPath string, stats *cgroups.Stats) error {
|
|
f, err := os.Open(filepath.Join(dirPath, "cpu.stat"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
sc := bufio.NewScanner(f)
|
|
for sc.Scan() {
|
|
t, v, err := fscommon.GetCgroupParamKeyValue(sc.Text())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
switch t {
|
|
case "usage_usec":
|
|
stats.CpuStats.CpuUsage.TotalUsage = v * 1000
|
|
|
|
case "user_usec":
|
|
stats.CpuStats.CpuUsage.UsageInUsermode = v * 1000
|
|
|
|
case "system_usec":
|
|
stats.CpuStats.CpuUsage.UsageInKernelmode = v * 1000
|
|
}
|
|
}
|
|
return nil
|
|
}
|