mbox series

[v6,00/10] Expand cgroup_lib shell library

Message ID cover.1658872195.git.luke.nowakowskikrijger@canonical.com
Headers show
Series Expand cgroup_lib shell library | expand

Message

Luke Nowakowski-Krijger July 26, 2022, 10:13 p.m. UTC
Update the remaining tests and shell library expansion after review.

Rebased off of accepted tst_cgroup changes in previous patchset version.

Luke Nowakowski-Krijger (10):
  testcases/lib: Implement tst_cgctl binary
  controllers: Expand cgroup_lib shell library
  controllers: Update cgroup_fj_* to use newer cgroup lib and test lib
  controllers: Update memcg_control_test to newer test lib and cgroup
    lib
  controllers: Update memcg/regression/* to new test and cgroup lib
  controllers: Update memcg_stress_test to use newer cgroup lib
  controllers: update memcg/functional to use newer cgroup lib
  controllers: Update pids.sh to use newer cgroup lib
  controllers: update cpuset_regression_test.sh to use newer cgroup lib
  controllers: update cgroup_regression_test to use newer cgroup lib

 .../cgroup/cgroup_regression_test.sh          |  31 +--
 .../controllers/cgroup_fj/cgroup_fj_common.sh | 115 +++-------
 .../cgroup_fj/cgroup_fj_function.sh           | 173 ++++++++-------
 .../controllers/cgroup_fj/cgroup_fj_proc.c    |  24 +--
 .../controllers/cgroup_fj/cgroup_fj_stress.sh | 171 ++++++++-------
 testcases/kernel/controllers/cgroup_lib.sh    | 137 ++++++++++--
 .../cpuset/cpuset_regression_test.sh          |  26 +--
 .../controllers/memcg/control/mem_process.c   |  28 +--
 .../memcg/control/memcg_control_test.sh       | 149 ++++---------
 .../memcg/functional/memcg_force_empty.sh     |   2 +-
 .../controllers/memcg/functional/memcg_lib.sh |  54 ++---
 .../memcg/regression/memcg_regression_test.sh | 203 +++++++++---------
 .../memcg/regression/memcg_test_1.c           |  40 ++--
 .../memcg/regression/memcg_test_2.c           |  24 +--
 .../memcg/regression/memcg_test_3.c           |  37 ++--
 .../memcg/regression/memcg_test_4.c           |  24 +--
 .../memcg/regression/memcg_test_4.sh          |  50 ++---
 .../memcg/stress/memcg_stress_test.sh         |  32 ++-
 testcases/kernel/controllers/pids/pids.sh     |  67 +-----
 testcases/lib/Makefile                        |   2 +-
 testcases/lib/tst_cgctl.c                     |  87 ++++++++
 21 files changed, 690 insertions(+), 786 deletions(-)
 create mode 100644 testcases/lib/tst_cgctl.c

Comments

Li Wang July 27, 2022, 6:34 a.m. UTC | #1
Hi Petr and all,

I agree with all the changes in V6, pretty good.
Feel free to add my Reviewed-by when you do merge.
Petr Vorel July 27, 2022, 10:14 a.m. UTC | #2
Hi all,

> Hi Petr and all,

> I agree with all the changes in V6, pretty good.
> Feel free to add my Reviewed-by when you do merge.

FYI I'm going to merge whole patchset after tests finish to run, with the following
diff below and Li's and Richie's RBT.

* escape > in rod (ROD ... \>)
-	ROD echo $! > "$test_dir/$task_list"
+	ROD echo $! \> "$test_dir/$task_list"
@Luke: it would not work without it.
https://github.com/linux-test-project/ltp/wiki/Shell-Test-API#rod-and-rod_silent
NOTE: I plan to add a shell check for it to SHELL_CHECK (i.e. grep -E 'ROD[^\>]+>').

* fix "$ctrl" detection
@Luke: [ $# -eq 0 ] was not optimal, but it worked, because the original autor
Cristian Marussi who added first checks during rewrite called
cgroup_get_test_path() without quotes when passed variables. You started to
quote them, which broke this check because passing "" means $# = 1. But simply
testing whether variable contains anything is better:

-	[ $# -eq 0 ] && tst_brk TBROK "cgroup_get_test_path: controller not defined"
+	[ "$ctrl" ] || tst_brk TBROK "cgroup_get_test_path: controller not defined"

* optimize testing:
-	[ "$_cgroup_state" = "" ] && tst_brk TBROK "cgroup_get_test_path: No previous state found. Forgot to call cgroup_require?"
+	[ "$_cgroup_state" ] || tst_brk TBROK "cgroup_get_test_path: No previous state found. Forgot to call cgroup_require?"

* fix extra space at help in testcases/lib/tst_cgctl.c
-	fprintf(stderr, "Usage: tst_cgctl require [controller] [test_pid]\n\tcleanup [config (output of tst_cg_print_config)]\n\tprint\n\t help\n");
+	fprintf(stderr, "Usage: tst_cgctl require [controller] [test_pid]\n\tcleanup [config (output of tst_cg_print_config)]\n\tprint\n\thelp\n");

Kind regards,
Petr

diff --git testcases/kernel/controllers/cgroup_lib.sh testcases/kernel/controllers/cgroup_lib.sh
index 5fe2252be..9e59221ab 100644
--- testcases/kernel/controllers/cgroup_lib.sh
+++ testcases/kernel/controllers/cgroup_lib.sh
@@ -15,8 +15,8 @@ cgroup_get_mountpoint()
 	local ctrl="$1"
 	local mountpoint
 
-	[ $# -eq 0 ] && tst_brk TBROK "cgroup_get_mountpoint: controller not defined"
-	[ "$_cgroup_state" = "" ] && tst_brk TBROK "cgroup_get_mountpoint: No previous state found. Forgot to call cgroup_require?"
+	[ "$ctrl" ] || tst_brk TBROK "cgroup_get_mountpoint: controller not defined"
+	[ "$_cgroup_state" ] || tst_brk TBROK "cgroup_get_mountpoint: No previous state found. Forgot to call cgroup_require?"
 
 	mountpoint=$(echo "$_cgroup_state" | grep -w "^$ctrl" | awk '{ print $4 }')
 	echo "$mountpoint"
@@ -34,8 +34,8 @@ cgroup_get_test_path()
 	local mountpoint
 	local test_path
 
-	[ $# -eq 0 ] && tst_brk TBROK "cgroup_get_test_path: controller not defined"
-	[ "$_cgroup_state" = "" ] && tst_brk TBROK "cgroup_get_test_path: No previous state found. Forgot to call cgroup_require?"
+	[ "$ctrl" ] || tst_brk TBROK "cgroup_get_test_path: controller not defined"
+	[ "$_cgroup_state" ] || tst_brk TBROK "cgroup_get_test_path: No previous state found. Forgot to call cgroup_require?"
 
 	mountpoint=$(cgroup_get_mountpoint "$ctrl")
 
@@ -57,11 +57,11 @@ cgroup_get_version()
 	local ctrl="$1"
 	local version
 
-	[ $# -eq 0 ] && tst_brk TBROK "cgroup_get_version: controller not defined"
-	[ "$_cgroup_state" = "" ] && tst_brk TBROK "cgroup_get_version: No previous state found. Forgot to call cgroup_require?"
+	[ "$ctrl" ] || tst_brk TBROK "cgroup_get_version: controller not defined"
+	[ "$_cgroup_state" ] || tst_brk TBROK "cgroup_get_version: No previous state found. Forgot to call cgroup_require?"
 
 	version=$(echo "$_cgroup_state" | grep -w "^$ctrl" | awk '{ print $2 }')
-	[ "$version" = "" ] && tst_brk TBROK "cgroup_get_version: Could not find controller $ctrl"
+	[  "$version" ] || tst_brk TBROK "cgroup_get_version: Could not find controller $ctrl"
 
 	echo "$version"
 
@@ -73,7 +73,7 @@ cgroup_get_version()
 # Can be safely called even when no setup has been done
 cgroup_cleanup()
 {
-	[ "$_cgroup_state" = "" ] && return 0
+	[ "$_cgroup_state" ] || return 0
 
 	ROD tst_cgctl cleanup "$_cgroup_state"
 
@@ -91,7 +91,7 @@ cgroup_get_task_list()
 	local ctrl="$1"
 	local version
 
-	[ $# -eq 0 ] && tst_brk TBROK "cgroup_get_task_list: controller not defined"
+	[ "$ctrl" ] || tst_brk TBROK "cgroup_get_task_list: controller not defined"
 
 	version=$(cgroup_get_version "$ctrl")
 
@@ -111,7 +111,7 @@ cgroup_require()
 	local ctrl="$1"
 	local ret
 
-	[ $# -eq 0 ] && tst_brk TBROK "cgroup_require: controller not defined"
+	[ "$ctrl" ] || tst_brk TBROK "cgroup_require: controller not defined"
 
 	[ ! -f /proc/cgroups ] && tst_brk TCONF "Kernel does not support control groups"
 
@@ -124,11 +124,11 @@ cgroup_require()
 	fi
 
 	if [ $ret -ne 0 ]; then
-		tst_brk TBROK "'tst_cgctl require' exited."
+		tst_brk TBROK "'tst_cgctl require' exited"
 		return $ret
 	fi
 
-	[ "$_cgroup_state" = "" ] && tst_brk TBROK "cgroup_require: No state was set after call to tst_cgctl require?"
+	[ "$_cgroup_state" ] || tst_brk TBROK "cgroup_require: No state was set after call to tst_cgctl require?"
 
 	return 0
 }
diff --git testcases/kernel/controllers/memcg/control/memcg_control_test.sh testcases/kernel/controllers/memcg/control/memcg_control_test.sh
index f96ed3abb..093d50c2a 100644
--- testcases/kernel/controllers/memcg/control/memcg_control_test.sh
+++ testcases/kernel/controllers/memcg/control/memcg_control_test.sh
@@ -23,7 +23,7 @@ test_proc_kill()
 {
 	mem_process -m $PROC_MEM &
 	sleep 1
-	ROD echo $! > "$test_dir/$task_list"
+	ROD echo $! \> "$test_dir/$task_list"
 
 	#Instruct the test process to start acquiring memory
 	echo m > $STATUS_PIPE
@@ -46,8 +46,8 @@ test1()
 
 	tst_res TINFO "Test #1: Checking if the memory usage limit imposed by the topmost group is enforced"
 
-	ROD echo "$ACTIVE_MEM_LIMIT" > "$test_dir/$memory_limit"
-	ROD echo "$TOT_MEM_LIMIT" > "$test_dir/$memsw_memory_limit"
+	ROD echo "$ACTIVE_MEM_LIMIT" \> "$test_dir/$memory_limit"
+	ROD echo "$TOT_MEM_LIMIT" \> "$test_dir/$memsw_memory_limit"
 
 	KILLED_CNT=0
 	test_proc_kill
diff --git testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh
index bc8a1c661..94d4e4c00 100755
--- testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh
+++ testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh
@@ -111,7 +111,7 @@ test_1()
 	test_path="$test_dir/0"
 
 	create_testpath "$test_path"
-	ROD echo 0 > "$test_path/$memory_limit"
+	ROD echo 0 \> "$test_path/$memory_limit"
 
 	./memcg_test_1 "$test_path/$task_list"
 
@@ -149,7 +149,7 @@ test_2()
 	sleep 1
 
 	create_testpath "$test_path"
-	ROD echo $pid1 > "$test_path"/tasks
+	ROD echo $pid1 \> "$test_path"/tasks
 
 	# let pid1 'test_2' allocate memory
 	/bin/kill -SIGUSR1 $pid1
diff --git testcases/kernel/controllers/memcg/stress/memcg_stress_test.sh testcases/kernel/controllers/memcg/stress/memcg_stress_test.sh
index d38c650ea..cb52840d7 100755
--- testcases/kernel/controllers/memcg/stress/memcg_stress_test.sh
+++ testcases/kernel/controllers/memcg/stress/memcg_stress_test.sh
@@ -26,7 +26,7 @@ setup()
 	test_path=$(cgroup_get_test_path "memory")
 	task_list=$(cgroup_get_task_list "memory")
 	if [ "$cgroup_version" = "2" ]; then
-		ROD echo "+memory" > "$test_path/cgroup.subtree_control"
+		ROD echo "+memory" \> "$test_path/cgroup.subtree_control"
 	fi
 
 	tst_res TINFO "test starts with cgroup version $cgroup_version"
@@ -68,7 +68,7 @@ run_stress()
 	for i in $(seq 0 $(($cgroups-1))); do
 		ROD mkdir "$test_path/$i"
 		memcg_process_stress $mem_size $interval &
-		ROD echo $! > "$test_path/$i/$task_list"
+		ROD echo $! \> "$test_path/$i/$task_list"
 		pids="$pids $!"
 	done
 
diff --git testcases/lib/tst_cgctl.c testcases/lib/tst_cgctl.c
index 8ef615a56..2685bef81 100644
--- testcases/lib/tst_cgctl.c
+++ testcases/lib/tst_cgctl.c
@@ -12,7 +12,7 @@
 
 static void cgctl_usage(void)
 {
-	fprintf(stderr, "Usage: tst_cgctl require [controller] [test_pid]\n\tcleanup [config (output of tst_cg_print_config)]\n\tprint\n\t help\n");
+	fprintf(stderr, "Usage: tst_cgctl require [controller] [test_pid]\n\tcleanup [config (output of tst_cg_print_config)]\n\tprint\n\thelp\n");
 }
 
 static int cgctl_require(const char *ctrl, int test_pid)
Petr Vorel July 27, 2022, 12:13 p.m. UTC | #3
Hi all,

patchset merged.
Luke, thanks a lot for amazing work, others for review!

FYI with these fixes there are only 6 tests failing on openSUSE Tumbleweed setup:

* memcg_stress: timeout after 15 min
* memcontrol04
memcontrol04.c:214: TFAIL: Expect: (F low events=379) == 0

* controllers
TEST 1: CPU CONTROLLER TESTING
RUNNING SETUP.....
ERROR: Could not mount cgroup filesystem on /dev/cpuctl..Exiting test
Cleanup called
cat: /dev/cpuctl/group_def/tasks: No such file or directory
...
Cleanup done for latency test 2

mount: /dev/cpuctl: cpuctl already mounted or mount point busy.
cpuctl_test_fj    1  TFAIL  :  ltpapicmd.c:188: failed to mount cpu subsystem... Exiting
cpuctl_test_fj    1  TFAIL  :  ltpapicmd.c:188: case1    FAIL

* cpuset_inherit
cpuset_inherit 1 TFAIL: Could not mount cgroup filesystem with  cpuset on /dev/cpuset..Exiting test

* cpuset_hotplug
cpuset_hotplug 1 TFAIL: Could not mount cgroup filesystem with  cpuset on /dev/cpuset..Exiting test

* cpuset_regression_test
cpuset_regression_test 1 TBROK: Both cpuset.cpu_exclusive and cpu_exclusive do not exist

Kind regards,
Petr