Skip to content

Commit 84a4646

Browse files
authored
Merge pull request #851 from askervin/5JO_cgroup_v2_cpu_resources
cri-resmgr: fix cgroup v2 paths in available resources
2 parents 08a4622 + 84de566 commit 84a4646

File tree

2 files changed

+34
-8
lines changed
  • pkg/cri/resource-manager/policy
  • test/e2e/policies.test-suite/topology-aware/n4c16/test04-available-resources

2 files changed

+34
-8
lines changed

pkg/cri/resource-manager/policy/flags.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ package policy
1616

1717
import (
1818
"encoding/json"
19+
"errors"
1920
"io/ioutil"
21+
"os"
2022
"path/filepath"
2123
"sort"
2224
"strconv"
@@ -121,6 +123,9 @@ func (cs *ConstraintSet) parseCPU(value string) error {
121123
} else {
122124
spec = value
123125
}
126+
if len(spec) == 0 {
127+
return policyError("missing CPU constraint value")
128+
}
124129

125130
switch {
126131
case kind == "cgroup" || spec[0] == '/':
@@ -163,11 +168,25 @@ func (cs *ConstraintSet) parseCPUQuantity(value string) error {
163168
}
164169

165170
func (cs *ConstraintSet) parseCPUFromCgroup(dir string) error {
166-
cpusetDir := cgroups.Cpuset.Path()
167-
if !strings.HasPrefix(dir, cpusetDir+"/") {
168-
dir = filepath.Join(cpusetDir, dir)
171+
pathToCpuset := func(outPath *string, fragments ...string) bool {
172+
*outPath = filepath.Join(filepath.Join(fragments...), "cpuset.cpus")
173+
_, err := os.Stat(*outPath)
174+
return !errors.Is(err, os.ErrNotExist)
175+
}
176+
path := ""
177+
switch {
178+
case len(dir) == 0:
179+
return policyError("empty CPU cgroup constraint")
180+
case dir[0] == '/' && pathToCpuset(&path, dir):
181+
// dir is a direct, absolute path to an existing cgroup
182+
case pathToCpuset(&path, cgroups.GetMountDir(), dir):
183+
// dir is a relative path starting from the cgroup mount point
184+
case pathToCpuset(&path, cgroups.Cpuset.Path(), dir):
185+
// dir is a relative path starting from the cpuset controller (cgroup v1)
186+
default:
187+
// dir is none of the previous
188+
return policyError("failed to find cpuset.cpus for CPU cgroup constraint %q", dir)
169189
}
170-
path := filepath.Join(dir, "cpuset.cpus")
171190
bytes, err := ioutil.ReadFile(path)
172191
if err != nil {
173192
return policyError("failed read CPU cpuset cgroup constraint %q: %v",

test/e2e/policies.test-suite/topology-aware/n4c16/test04-available-resources/code.var.sh

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,15 @@ test-and-verify-allowed() {
3939
reset counters
4040
}
4141

42-
CRIRM_CGROUP=/sys/fs/cgroup/cpuset/cri-resmgr-test-05-1
43-
vm-command "rm -rf $CRIRM_CGROUP; mkdir $CRIRM_CGROUP; echo 1-4,11 > $CRIRM_CGROUP/cpuset.cpus"
42+
if vm-command "[ -d /sys/fs/cgroup/cpuset ]"; then
43+
# cgroup v1
44+
CGROUP_CPUSET=/sys/fs/cgroup/cpuset
45+
else
46+
# cgroup v2
47+
CGROUP_CPUSET=/sys/fs/cgroup
48+
fi
49+
CRIRM_CGROUP=$CGROUP_CPUSET/cri-resmgr-test-05-1
50+
vm-command "rmdir $CRIRM_CGROUP; mkdir $CRIRM_CGROUP; echo 1-4,11 > $CRIRM_CGROUP/cpuset.cpus"
4451

4552
terminate cri-resmgr
4653
AVAILABLE_CPU="\"$CRIRM_CGROUP\""
@@ -49,8 +56,8 @@ launch cri-resmgr
4956
test-and-verify-allowed 1 2 3 4
5057
vm-command "rmdir $CRIRM_CGROUP || true"
5158

52-
CRIRM_CGROUP=/sys/fs/cgroup/cpuset/cri-resmgr-test-05-2
53-
vm-command "rm -rf $CRIRM_CGROUP; mkdir $CRIRM_CGROUP; echo 5-8,11 > $CRIRM_CGROUP/cpuset.cpus"
59+
CRIRM_CGROUP=$CGROUP_CPUSET/cri-resmgr-test-05-2
60+
vm-command "rmdir $CRIRM_CGROUP; mkdir $CRIRM_CGROUP; echo 5-8,11 > $CRIRM_CGROUP/cpuset.cpus"
5461

5562
terminate cri-resmgr
5663
AVAILABLE_CPU="\"${CRIRM_CGROUP#/sys/fs/cgroup/cpuset}\""

0 commit comments

Comments
 (0)