Make cgroup test scripts ash compatible.
Remove cg-tools dependency.
Add documentation for functions.
Tested with busybox on Ubuntu.
Signed-off-by: Haitao Huang
---
tools/testing/selftests/sgx/ash_cgexec.sh | 58 ++
.../selftests/sgx/run_epc_cg_selftests.sh | 171 +++---
.../selftests/sgx/watch_misc_for_tests.sh | 13 +-
3 files changed, 165 insertions(+), 77 deletions(-)
create mode 100755 tools/testing/selftests/sgx/ash_cgexec.sh
diff --git a/tools/testing/selftests/sgx/ash_cgexec.sh
b/tools/testing/selftests/sgx/ash_cgexec.sh
new file mode 100755
index ..51232d6452a8
--- /dev/null
+++ b/tools/testing/selftests/sgx/ash_cgexec.sh
@@ -0,0 +1,58 @@
+#!/usr/bin/env sh
+# SPDX-License-Identifier: GPL-2.0
+# Copyright(c) 2024 Intel Corporation.
+
+# Move the current shell process to the specified cgroup
+# Arguments:
+# $1 - The cgroup controller name, e.g., misc, memory.
+# $2 - The path of the cgroup,
+# relative to /sys/fs/cgroup for cgroup v2,
+# relative to /sys/fs/cgroup/$1 for v1.
+move_to_cgroup() {
+controllers="$1"
+path="$2"
+
+# Check if cgroup v2 is in use
+if [ ! -d "/sys/fs/cgroup/misc" ]; then
+# Cgroup v2 logic
+cgroup_full_path="/sys/fs/cgroup/${path}"
+echo $$ > "${cgroup_full_path}/cgroup.procs"
+else
+# Cgroup v1 logic
+OLD_IFS="$IFS"
+IFS=','
+for controller in $controllers; do
+cgroup_full_path="/sys/fs/cgroup/${controller}/${path}"
+echo $$ > "${cgroup_full_path}/tasks"
+done
+IFS="$OLD_IFS"
+fi
+}
+
+if [ "$#" -lt 3 ] || [ "$1" != "-g" ]; then
+echo "Usage: $0 -g [-g
...] [args...]"
+exit 1
+fi
+
+while [ "$#" -gt 0 ]; do
+case "$1" in
+-g)
+# Ensure that a controller:path pair is provided after -g
+if [ -z "$2" ]; then
+echo "Error: Missing controller:path argument after -g"
+exit 1
+fi
+IFS=':' read CONTROLLERS CGROUP_PATH < $CG_MISC_ROOT/$TEST_CG_SUB1/misc.max
echo "sgx_epc $LARGE" > $CG_MISC_ROOT/$TEST_CG_SUB2/misc.max
echo "sgx_epc $LARGER" > $CG_MISC_ROOT/$TEST_CG_SUB4/misc.max
+if [ $? -ne 0 ]; then
+echo "# Failed setting up misc limits, make sure misc cgroup is mounted."
+exit 1
+fi
+
+clean_up_misc()
+{
+rmdir $CG_MISC_ROOT/$TEST_CG_SUB2
+rmdir $CG_MISC_ROOT/$TEST_CG_SUB3
+rmdir $CG_MISC_ROOT/$TEST_CG_SUB4
+rmdir $CG_MISC_ROOT/$TEST_CG_SUB1
+rmdir $CG_MISC_ROOT/$TEST_ROOT_CG
+}
+
timestamp=$(date +%Y%m%d_%H%M%S)
test_cmd="./test_sgx -t unclobbered_vdso_oversubscribed"
+# Wait for a process and check for expected exit status.
+#
+# Arguments:
+# $1 - the pid of the process to wait and check.
+# $2 - 1 if expecting success, 0 for failure.
+#
+# Return:
+# 0 if the exit status of the process matches the expectation.
+# 1 otherwise.
wait_check_process_status() {
-local pid=$1
-local check_for_success=$2 # If 1, check for success;
-# If 0, check for failure
+pid=$1
+check_for_success=$2 # If 1, check for success;
+ # If 0, check for failure
wait "$pid"
-local status=$?
+status=$?
-if [[ $check_for_success -eq 1 && $status -eq 0 ]]; then
+if [ $check_for_success -eq 1 ] && [ $status -eq 0 ]; then
echo "# Process $pid succeeded."
return 0
-elif [[ $check_for_success -eq 0 && $status -ne 0 ]]; then
+elif [ $check_for_success -eq 0 ] && [ $status -ne 0 ]; then
echo "# Process $pid returned failure."
return 0
fi
return 1
}
+# Wait for a set of processes and check for expected exit status
+#
+# Arguments:
+# $1 - 1 if expecting success, 0 for failure.
+# remaining args - The pids of the processes
+#
+# Return:
+# 0 if exit status of any process matches the expectation.
+# 1 otherwise.
wait_and_detect_for_any() {
-local pids=("$@")
-local check_for_success=$1 # If 1, check for success;
-# If 0, check for failure
-local detected=1 # 0 for success detection
+check_for_success=$1 # If 1, check for success;
+ # If 0, check for failure
+shift
+detected=1 # 0 for success detection
-for pid in "${pids[@]:1}"; do
+for pid in $@; do
if wait_check_process_status "$pid" "$check_for_success"; then
detected=0
# Wait for other processes to exit
@@ -88,10 +114,10 @@ wait_and_detect_for_any() {
echo "# Start unclobbered_vdso_oversubscribed with SMALL limit, expecting
failure..."
# Always use leaf node of misc cgroups so it works for both v1 and v2
# these may fail on OOM
-cgexec -g misc:$TEST_CG_SUB3 $test_cmd >cgtest_small_$timestamp.log 2>&1
-if [[ $? -eq 0 ]]; then
+./ash_cgexec.sh -g misc:$TEST_CG_SUB3 $test_cmd >cgtest_small_$timestamp.log
2>&1
+if [