From 3c424b841cf3cf66b085a424f4b537fbc3bbff6f Mon Sep 17 00:00:00 2001 From: Haitao Huang Date: Wed, 27 Mar 2024 19:52:31 -0700 Subject: [PATCH] selftest/sgx: Make cgroup test scripts ash compatible Tested with busybox on Ubuntu. Signed-off-by: Haitao Huang --- .../selftests/sgx/run_epc_cg_selftests.sh | 85 ++++++++++--------- .../selftests/sgx/watch_misc_for_tests.sh | 13 ++- 2 files changed, 51 insertions(+), 47 deletions(-) diff --git a/tools/testing/selftests/sgx/run_epc_cg_selftests.sh b/tools/testing/selftests/sgx/run_epc_cg_selftests.sh index e027bf39f005b2..534f4a55814862 100755 --- a/tools/testing/selftests/sgx/run_epc_cg_selftests.sh +++ b/tools/testing/selftests/sgx/run_epc_cg_selftests.sh @@ -1,4 +1,4 @@ -#!/bin/bash +##!/usr/bin/env sh # SPDX-License-Identifier: GPL-2.0 # Copyright(c) 2023 Intel Corporation. @@ -53,16 +53,16 @@ timestamp=$(date +%Y%m%d_%H%M%S) test_cmd="./test_sgx -t unclobbered_vdso_oversubscribed" wait_check_process_status() { - local pid=$1 - local check_for_success=$2 # If 1, check for success; + 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 @@ -70,12 +70,12 @@ wait_check_process_status() { } wait_and_detect_for_any() { - local pids=("$@") - local check_for_success=$1 # If 1, check for success; + check_for_success=$1 # If 1, check for success; # If 0, check for failure - local detected=1 # 0 for success detection + 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 @@ -89,7 +89,7 @@ echo "# Start unclobbered_vdso_oversubscribed with SMALL limit, expecting failur # 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 +if [ $? -eq 0 ]; then echo "# Fail on SMALL limit, not expecting any test passes." cgdelete -r -g misc:$TEST_ROOT_CG exit 1 @@ -102,16 +102,16 @@ echo "# PASSED SMALL limit." echo "# Start 4 concurrent unclobbered_vdso_oversubscribed tests with LARGE limit, expecting at least one success...." -pids=() -for i in {1..4}; do +pids="" +for i in 1 2 3 4; do ( cgexec -g misc:$TEST_CG_SUB2 $test_cmd >cgtest_large_positive_$timestamp.$i.log 2>&1 ) & - pids+=($!) + pids="$pids $!" done -if wait_and_detect_for_any 1 "${pids[@]}"; then +if wait_and_detect_for_any 1 "$pids"; then echo "# PASSED LARGE limit positive testing." else echo "# Failed on LARGE limit positive testing, no test passes." @@ -121,15 +121,15 @@ fi echo "# Start 5 concurrent unclobbered_vdso_oversubscribed tests with LARGE limit, expecting at least one failure...." -pids=() -for i in {1..5}; do +pids="" +for i in 1 2 3 4 5; do ( cgexec -g misc:$TEST_CG_SUB2 $test_cmd >cgtest_large_negative_$timestamp.$i.log 2>&1 ) & - pids+=($!) + pids="$pids $!" done -if wait_and_detect_for_any 0 "${pids[@]}"; then +if wait_and_detect_for_any 0 "$pids"; then echo "# PASSED LARGE limit negative testing." else echo "# Failed on LARGE limit negative testing, no test fails." @@ -139,15 +139,15 @@ fi echo "# Start 8 concurrent unclobbered_vdso_oversubscribed tests with LARGER limit, expecting no failure...." -pids=() -for i in {1..8}; do +pids="" +for i in 1 2 3 4 5 6 7 8; do ( cgexec -g misc:$TEST_CG_SUB4 $test_cmd >cgtest_larger_$timestamp.$i.log 2>&1 ) & - pids+=($!) + pids="$pids $!" done -if wait_and_detect_for_any 0 "${pids[@]}"; then +if wait_and_detect_for_any 0 "$pids"; then echo "# Failed on LARGER limit, at least one test fails." cgdelete -r -g misc:$TEST_ROOT_CG exit 1 @@ -157,36 +157,43 @@ fi echo "# Start 8 concurrent unclobbered_vdso_oversubscribed tests with LARGER limit, randomly kill one, expecting no failure...." -pids=() -for i in {1..8}; do +pids="" +for i in 1 2 3 4 5 6 7 8; do ( cgexec -g misc:$TEST_CG_SUB4 $test_cmd >cgtest_larger_kill_$timestamp.$i.log 2>&1 ) & - pids+=($!) + pids="$pids $!" done - -sleep $((RANDOM % 10 + 5)) +random_number=$(awk 'BEGIN{srand();print int(rand()*10)}') +sleep $((random_number + 5)) # Randomly select a PID to kill -RANDOM_INDEX=$((RANDOM % 8)) -PID_TO_KILL=${pids[RANDOM_INDEX]} +RANDOM_INDEX=$(awk 'BEGIN{srand();print int(rand()*8)}') +counter=0 +for pid in $pids; do + if [ "$counter" -eq "$RANDOM_INDEX" ]; then + PID_TO_KILL=$pid + break + fi + counter=$((counter + 1)) +done kill $PID_TO_KILL echo "# Killed process with PID: $PID_TO_KILL" any_failure=0 -for pid in "${pids[@]}"; do +for pid in $pids; do wait "$pid" status=$? if [ "$pid" != "$PID_TO_KILL" ]; then - if [[ $status -ne 0 ]]; then + if [ $status -ne 0 ]; then echo "# Process $pid returned failure." any_failure=1 fi fi done -if [[ $any_failure -ne 0 ]]; then +if [ $any_failure -ne 0 ]; then echo "# Failed on random killing, at least one test fails." cgdelete -r -g misc:$TEST_ROOT_CG exit 1 @@ -201,7 +208,7 @@ if [ $? -ne 0 ]; then fi MEM_LIMIT_TOO_SMALL=$((CAPACITY - 2 * LARGE)) -if [[ $CG_V1 -eq 0 ]]; then +if [ $CG_V1 -eq 0 ]; then echo "$MEM_LIMIT_TOO_SMALL" > $CG_MEM_ROOT/$TEST_CG_SUB2/memory.max else echo "$MEM_LIMIT_TOO_SMALL" > $CG_MEM_ROOT/$TEST_CG_SUB2/memory.limit_in_bytes @@ -210,16 +217,16 @@ fi echo "# Start 4 concurrent unclobbered_vdso_oversubscribed tests with LARGE EPC limit, and too small RAM limit, expecting all failures...." -pids=() -for i in {1..4}; do +pids="" +for i in 1 2 3 4; do ( cgexec -g memory:$TEST_CG_SUB2 -g misc:$TEST_CG_SUB2 $test_cmd \ >cgtest_large_oom_$timestamp.$i.log 2>&1 ) & - pids+=($!) + pids="$pids $!" done -if wait_and_detect_for_any 1 "${pids[@]}"; then +if wait_and_detect_for_any 1 "$pids"; then echo "# Failed on tests with memcontrol, some tests did not fail." cgdelete -r -g misc:$TEST_ROOT_CG if [[ $CG_V1 -ne 0 ]]; then @@ -240,7 +247,7 @@ else echo "# PASSED ALL cgroup limit tests, cleanup cgroups..." fi cgdelete -r -g misc:$TEST_ROOT_CG -if [[ $CG_V1 -ne 0 ]]; then +if [ $CG_V1 -ne 0 ]; then cgdelete -r -g memory:$TEST_ROOT_CG fi echo "# done." diff --git a/tools/testing/selftests/sgx/watch_misc_for_tests.sh b/tools/testing/selftests/sgx/watch_misc_for_tests.sh index dbd38f346e7ba3..3b05475938d061 100755 --- a/tools/testing/selftests/sgx/watch_misc_for_tests.sh +++ b/tools/testing/selftests/sgx/watch_misc_for_tests.sh @@ -1,13 +1,10 @@ -#!/bin/bash -# SPDX-License-Identifier: GPL-2.0 +##!/usr/bin/env sh +#!/bin/sh # Copyright(c) 2023 Intel Corporation. -if [ -z "$1" ] - then - echo "No argument supplied, please provide 'max', 'current' or 'events'" +if [ -z "$1" ]; then + echo "No argument supplied, please provide 'max', 'current', or 'events'" exit 1 fi -watch -n 1 "find /sys/fs/cgroup -wholename */test*/misc.$1 -exec sh -c \ - 'echo \"\$1:\"; cat \"\$1\"' _ {} \;" - +watch -n 1 'find /sys/fs/cgroup -wholename "*/test*/misc.'$1'" -exec sh -c '\''echo "$1:"; cat "$1"'\'' _ {} \;'