Skip to content

Commit e3d9c0a

Browse files
committed
libct/cg/fs2: Fix statHugeTlb error when rsvd usage is present
Signed-off-by: Gavin Lam <[email protected]>
1 parent b970779 commit e3d9c0a

File tree

3 files changed

+163
-2
lines changed

3 files changed

+163
-2
lines changed

fs2/hugetlb.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ func statHugeTlb(dirPath string, stats *cgroups.Stats) error {
4545
rsvd := ".rsvd"
4646
for _, pagesize := range cgroups.HugePageSizes() {
4747
again:
48-
prefix := "hugetlb." + pagesize + rsvd
49-
value, err := fscommon.GetCgroupParamUint(dirPath, prefix+".current")
48+
prefix := "hugetlb." + pagesize
49+
value, err := fscommon.GetCgroupParamUint(dirPath, prefix+rsvd+".current")
5050
if err != nil {
5151
if rsvd != "" && errors.Is(err, os.ErrNotExist) {
5252
rsvd = ""

fs2/hugetlb_test.go

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package fs2
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"testing"
7+
8+
"github.com/opencontainers/cgroups"
9+
"github.com/opencontainers/cgroups/fscommon"
10+
)
11+
12+
const (
13+
hugetlbUsageContents = "128"
14+
hugetlbFailcnt = "max 100"
15+
)
16+
17+
const (
18+
usage = "hugetlb.%s.current"
19+
limit = "hugetlb.%s.max"
20+
failcnt = "hugetlb.%s.events"
21+
22+
rsvdUsage = "hugetlb.%s.rsvd.current"
23+
rsvdLimit = "hugetlb.%s.rsvd.max"
24+
)
25+
26+
func TestSetHugetlb(t *testing.T) {
27+
path := t.TempDir()
28+
29+
const (
30+
hugetlbBefore = 256
31+
hugetlbAfter = 512
32+
)
33+
34+
for _, pageSize := range cgroups.HugePageSizes() {
35+
writeFileContents(t, path, map[string]string{
36+
fmt.Sprintf(limit, pageSize): strconv.Itoa(hugetlbBefore),
37+
})
38+
}
39+
40+
r := &cgroups.Resources{}
41+
for _, pageSize := range cgroups.HugePageSizes() {
42+
r.HugetlbLimit = []*cgroups.HugepageLimit{
43+
{
44+
Pagesize: pageSize,
45+
Limit: hugetlbAfter,
46+
},
47+
}
48+
if err := setHugeTlb(path, r); err != nil {
49+
t.Fatal(err)
50+
}
51+
}
52+
53+
for _, pageSize := range cgroups.HugePageSizes() {
54+
for _, f := range []string{limit, rsvdLimit} {
55+
limit := fmt.Sprintf(f, pageSize)
56+
value, err := fscommon.GetCgroupParamUint(path, limit)
57+
if err != nil {
58+
t.Fatal(err)
59+
}
60+
if value != hugetlbAfter {
61+
t.Fatalf("Set %s failed. Expected: %v, Got: %v", limit, hugetlbAfter, value)
62+
}
63+
}
64+
}
65+
}
66+
67+
func TestStatHugetlb(t *testing.T) {
68+
path := t.TempDir()
69+
for _, pageSize := range cgroups.HugePageSizes() {
70+
writeFileContents(t, path, map[string]string{
71+
fmt.Sprintf(rsvdUsage, pageSize): hugetlbUsageContents,
72+
fmt.Sprintf(failcnt, pageSize): hugetlbFailcnt,
73+
})
74+
}
75+
76+
actualStats := *cgroups.NewStats()
77+
err := statHugeTlb(path, &actualStats)
78+
if err != nil {
79+
t.Fatal(err)
80+
}
81+
expectedStats := cgroups.HugetlbStats{Usage: 128, Failcnt: 100}
82+
for _, pageSize := range cgroups.HugePageSizes() {
83+
if expectedStats != actualStats.HugetlbStats[pageSize] {
84+
t.Errorf("Expected hugetlb stats: %v, actual: %v", expectedStats, actualStats.HugetlbStats[pageSize])
85+
}
86+
}
87+
}
88+
89+
func TestStatHugetlbWithNoRsvdUsage(t *testing.T) {
90+
path := t.TempDir()
91+
for _, pageSize := range cgroups.HugePageSizes() {
92+
writeFileContents(t, path, map[string]string{
93+
fmt.Sprintf(usage, pageSize): hugetlbUsageContents,
94+
fmt.Sprintf(failcnt, pageSize): hugetlbFailcnt,
95+
})
96+
}
97+
98+
actualStats := *cgroups.NewStats()
99+
err := statHugeTlb(path, &actualStats)
100+
if err != nil {
101+
t.Fatal(err)
102+
}
103+
expectedStats := cgroups.HugetlbStats{Usage: 128, Failcnt: 100}
104+
for _, pageSize := range cgroups.HugePageSizes() {
105+
if expectedStats != actualStats.HugetlbStats[pageSize] {
106+
t.Errorf("Expected hugetlb stats: %v, actual: %v", expectedStats, actualStats.HugetlbStats[pageSize])
107+
}
108+
}
109+
}
110+
111+
func TestStatHugetlbNoUsageFile(t *testing.T) {
112+
path := t.TempDir()
113+
for _, pageSize := range cgroups.HugePageSizes() {
114+
writeFileContents(t, path, map[string]string{
115+
fmt.Sprintf(failcnt, pageSize): hugetlbFailcnt,
116+
})
117+
}
118+
119+
actualStats := *cgroups.NewStats()
120+
err := statHugeTlb(path, &actualStats)
121+
if err == nil {
122+
t.Fatal("Expected failure")
123+
}
124+
}
125+
126+
func TestStatHugetlbBadUsageFile(t *testing.T) {
127+
path := t.TempDir()
128+
for _, pageSize := range cgroups.HugePageSizes() {
129+
writeFileContents(t, path, map[string]string{
130+
fmt.Sprintf(usage, pageSize): "bad",
131+
})
132+
}
133+
134+
actualStats := *cgroups.NewStats()
135+
err := statHugeTlb(path, &actualStats)
136+
if err == nil {
137+
t.Fatal("Expected failure")
138+
}
139+
}

fs2/utils_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package fs2
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
8+
"github.com/opencontainers/cgroups"
9+
)
10+
11+
func init() {
12+
cgroups.TestMode = true
13+
}
14+
15+
func writeFileContents(t testing.TB, path string, fileContents map[string]string) {
16+
for file, contents := range fileContents {
17+
statPath := filepath.Join(path, file)
18+
if err := os.WriteFile(statPath, []byte(contents), 0o644); err != nil {
19+
t.Fatal(err)
20+
}
21+
}
22+
}

0 commit comments

Comments
 (0)