Skip to content

Commit

Permalink
selftest/sgx: Make cgroup test scripts ash compatible
Browse files Browse the repository at this point in the history
Tested with busybox on Ubuntu.

Signed-off-by: Haitao Huang <haitao.huang@linux.intel.com>
  • Loading branch information
haitaohuang committed Mar 28, 2024
1 parent 0d0d598 commit 3c424b8
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 47 deletions.
85 changes: 46 additions & 39 deletions 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.

Expand Down Expand Up @@ -53,29 +53,29 @@ 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
return 1
}

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
Expand All @@ -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
Expand All @@ -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."
Expand All @@ -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."
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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."
13 changes: 5 additions & 8 deletions 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"'\'' _ {} \;'

0 comments on commit 3c424b8

Please sign in to comment.