runc/patch/0020-runc-add-DT-for-cpuset.preferred_cpus-setting.patch
2023-09-06 16:18:19 +08:00

297 lines
6.7 KiB
Diff

From 8071a31f5fd66638bda75d371f62d6df9155b00b Mon Sep 17 00:00:00 2001
From: Vanient <xiadanni1@huawei.com>
Date: Mon, 9 May 2022 20:32:24 +0800
Subject: [PATCH] runc:add DT for cpuset.preferred_cpus setting
---
libcontainer/cgroups/fs/cpuset_test.go | 217 +++++++++++++++++++++++++
tests/test_docker_cpuset_preferred.sh | 41 +++++
2 files changed, 258 insertions(+)
create mode 100755 tests/test_docker_cpuset_preferred.sh
diff --git a/libcontainer/cgroups/fs/cpuset_test.go b/libcontainer/cgroups/fs/cpuset_test.go
index 8933b3c..0c72c7d 100644
--- a/libcontainer/cgroups/fs/cpuset_test.go
+++ b/libcontainer/cgroups/fs/cpuset_test.go
@@ -1,6 +1,9 @@
package fs
import (
+ "os"
+ "path/filepath"
+ "strings"
"reflect"
"testing"
@@ -66,6 +69,220 @@ func TestCPUSetSetCpus(t *testing.T) {
}
}
+type cpusetTestCase struct {
+ name string
+ dir string
+ cpuset string
+ wantPrefer string
+ wantCpuset string
+ errorStr string
+ wantErr bool
+}
+
+func getCpusetTestcaes() []cpusetTestCase {
+ testDir := "/sys/fs/cgroup/cpuset/runc-test"
+ errStr1 := "failed to set"
+ errStr2 := "invalid cpuset format"
+ errStr3 := "invalid preferred_cpus"
+ return []cpusetTestCase{
+ {
+ name: "Test1",
+ cpuset: "0,1,2,+1,2",
+ dir: testDir,
+ wantPrefer: "1-2",
+ wantCpuset: "0-2",
+ wantErr: false,
+ },
+ {
+ name: "Test2",
+ cpuset: "0-3,+1,2",
+ dir: testDir,
+ wantPrefer: "1-2",
+ wantCpuset: "0-3",
+ wantErr: false,
+ },
+ {
+ name: "Test3",
+ cpuset: "0,1,2,+1,2",
+ dir: "/aaa/bbb/invalid",
+ wantErr: true,
+ errorStr: errStr1,
+ },
+ {
+ name: "Test4",
+ cpuset: "0,1,2,+1,2",
+ dir: "",
+ wantErr: true,
+ errorStr: errStr1,
+ },
+ {
+ name: "Test5",
+ cpuset: "0,1,2,+1,2",
+ dir: "/" + strings.Repeat("a", 4097),
+ wantErr: true,
+ errorStr: errStr1,
+ },
+ {
+ name: "Test6",
+ cpuset: "0,1,2,a,+1",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test7",
+ cpuset: "0,1,2,+1,+2",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test8",
+ cpuset: "0,1,1.2,+1,2",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test9",
+ cpuset: "0,-1,2,+1,2",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test10",
+ cpuset: "012+1,2",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test11",
+ cpuset: "0,1,2,+3-1",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test12",
+ cpuset: "0,1,2,+4",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr3,
+ },
+ {
+ name: "Test13",
+ cpuset: "1-3+1-2",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test14",
+ cpuset: "1-3,+1,2",
+ dir: testDir,
+ wantPrefer: "1-2",
+ wantCpuset: "1-3",
+ wantErr: false,
+ },
+ {
+ name: "Test15",
+ cpuset: "1-3,+1-2",
+ dir: testDir,
+ wantPrefer: "1-2",
+ wantCpuset: "1-3",
+ wantErr: false,
+ },
+ {
+ name: "Test16",
+ cpuset: "1-3,+1,4",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr3,
+ },
+ {
+ name: "Test17",
+ cpuset: "1-3,+1-2-3",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test18",
+ cpuset: "1-3,+a-2",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test19",
+ cpuset: "1-3,+3-2",
+ dir: testDir,
+ wantErr: true,
+ errorStr: errStr2,
+ },
+ {
+ name: "Test20",
+ cpuset: "1-3,+2-10000",
+ dir: testDir,
+ wantErr: true,
+ errorStr: "value of out range",
+ },
+ }
+}
+
+func TestCpusetSetCpusetCpus(t *testing.T) {
+ cgroupRoot := "/sys/fs/cgroup"
+ testDir := filepath.Join(cgroupRoot, "cpuset", "runc-test")
+ err := os.MkdirAll(testDir, 0600)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer func() {
+ err := os.RemoveAll(testDir)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ cpuset := &CpusetGroup{}
+ tests := getCpusetTestcaes()
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ err := cpuset.setCpuset(tt.dir, tt.cpuset)
+ if (err != nil) != tt.wantErr {
+ t.Fatal(err)
+ }
+
+ if err != nil {
+ if !strings.Contains(err.Error(), tt.errorStr) {
+ t.Fatalf("Get the wrong error, want %v, get %v", tt.errorStr, err.Error())
+ }
+ return
+ }
+
+ value, err := getCgroupParamString(tt.dir, "cpuset.cpus")
+ if err != nil {
+ t.Fatalf("Failed to parse cpuset.cpus - %s", err)
+ }
+
+ if value != tt.wantCpuset {
+ t.Fatal("Got the wrong value, set cpuset.cpus failed.")
+ }
+
+ value, err = getCgroupParamString(tt.dir, "cpuset.preferred_cpus")
+ if err != nil {
+ t.Fatalf("Failed to parse cpuset.cpus - %s", err)
+ }
+
+ if value != tt.wantPrefer {
+ t.Fatal("Got the wrong value, set cpuset.cpus failed.")
+ }
+ })
+ }
+}
+
func TestCPUSetSetMems(t *testing.T) {
path := tempDir(t, "cpuset")
diff --git a/tests/test_docker_cpuset_preferred.sh b/tests/test_docker_cpuset_preferred.sh
new file mode 100755
index 0000000..c80db24
--- /dev/null
+++ b/tests/test_docker_cpuset_preferred.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.
+# rubik licensed under the Mulan PSL v2.
+# You can use this software according to the terms and conditions of the Mulan PSL v2.
+# You may obtain a copy of Mulan PSL v2 at:
+# http://license.coscl.org.cn/MulanPSL2
+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# PURPOSE.
+# See the Mulan PSL v2 for more details.
+# Create: 2022-05-09
+# Description:set preferred cpuset
+
+which docker > /dev/null
+if [ $? -ne 0 ]; then
+ echo "environment not supported, skip test"
+ exit 0
+fi
+
+image="rnd-dockerhub.huawei.com/official/euleros:latest"
+containerID=$(docker run -itd --cpuset-cpus 0,1,+1 $image sh)
+if [ $? -ne 0 ]; then
+ echo "FAILED: start container failed"
+ exit 1
+fi
+
+cpuset=$(cat /sys/fs/cgroup/cpuset/docker/"$containerID"/cpuset.cpus)
+preferred_cpuset=$(cat /sys/fs/cgroup/cpuset/docker/"$containerID"/cpuset.preferred_cpus)
+if [ "$cpuset" != "0-1" ]; then
+ echo "FAILED: get wrong cpuset value"
+ exit 1
+fi
+if [ "$preferred_cpuset" != "1" ]; then
+ echo "FAILED: get wrong preferred_cpuset value"
+ exit 1
+fi
+
+docker rm -f "$containerID" > /dev/null
+echo "PASS"
+exit 0
--
2.33.0