mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-24 17:23:29 -04:00
selftest/mm: make hugetlb_reparenting_test tolerant to async reparenting
In cgroup v2, memory and hugetlb usage reparenting is asynchronous. This can cause test flakiness when immediately asserting usage after deleting a child cgroup. To address this, add a helper function `assert_with_retry()` that checks usage values with a timeout-based retry. This improves test stability without relying on fixed sleep delays. Also bump up the tolerance size to 7MB. To avoid False Positives: ... # Assert memory charged correctly for child only use. # actual a = 11 MB # expected a = 0 MB # fail # cleanup # [FAIL] not ok 11 hugetlb_reparenting_test.sh -cgroup-v2 # exit=1 # 0 # SUMMARY: PASS=10 SKIP=0 FAIL=1 Link: https://lkml.kernel.org/r/20250407084201.74492-1-liwang@redhat.com Signed-off-by: Li Wang <liwang@redhat.com> Tested-by: Donet Tom <donettom@linux.ibm.com> Cc: Waiman Long <longman@redhat.com> Cc: Anshuman Khandual <anshuman.khandual@arm.com> Cc: Dev Jain <dev.jain@arm.com> Cc: Kirill A. Shuemov <kirill.shutemov@linux.intel.com> Cc: Shuah Khan <shuah@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
@@ -36,7 +36,7 @@ else
|
|||||||
do_umount=1
|
do_umount=1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
MNT='/mnt/huge/'
|
MNT='/mnt/huge'
|
||||||
|
|
||||||
function get_machine_hugepage_size() {
|
function get_machine_hugepage_size() {
|
||||||
hpz=$(grep -i hugepagesize /proc/meminfo)
|
hpz=$(grep -i hugepagesize /proc/meminfo)
|
||||||
@@ -60,6 +60,41 @@ function cleanup() {
|
|||||||
set -e
|
set -e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function assert_with_retry() {
|
||||||
|
local actual_path="$1"
|
||||||
|
local expected="$2"
|
||||||
|
local tolerance=$((7 * 1024 * 1024))
|
||||||
|
local timeout=20
|
||||||
|
local interval=1
|
||||||
|
local start_time
|
||||||
|
local now
|
||||||
|
local elapsed
|
||||||
|
local actual
|
||||||
|
|
||||||
|
start_time=$(date +%s)
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
actual="$(cat "$actual_path")"
|
||||||
|
|
||||||
|
if [[ $actual -ge $(($expected - $tolerance)) ]] &&
|
||||||
|
[[ $actual -le $(($expected + $tolerance)) ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
now=$(date +%s)
|
||||||
|
elapsed=$((now - start_time))
|
||||||
|
|
||||||
|
if [[ $elapsed -ge $timeout ]]; then
|
||||||
|
echo "actual = $((${actual%% *} / 1024 / 1024)) MB"
|
||||||
|
echo "expected = $((${expected%% *} / 1024 / 1024)) MB"
|
||||||
|
cleanup
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep $interval
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
function assert_state() {
|
function assert_state() {
|
||||||
local expected_a="$1"
|
local expected_a="$1"
|
||||||
local expected_a_hugetlb="$2"
|
local expected_a_hugetlb="$2"
|
||||||
@@ -70,58 +105,13 @@ function assert_state() {
|
|||||||
expected_b="$3"
|
expected_b="$3"
|
||||||
expected_b_hugetlb="$4"
|
expected_b_hugetlb="$4"
|
||||||
fi
|
fi
|
||||||
local tolerance=$((5 * 1024 * 1024))
|
|
||||||
|
|
||||||
local actual_a
|
assert_with_retry "$CGROUP_ROOT/a/memory.$usage_file" "$expected_a"
|
||||||
actual_a="$(cat "$CGROUP_ROOT"/a/memory.$usage_file)"
|
assert_with_retry "$CGROUP_ROOT/a/hugetlb.${MB}MB.$usage_file" "$expected_a_hugetlb"
|
||||||
if [[ $actual_a -lt $(($expected_a - $tolerance)) ]] ||
|
|
||||||
[[ $actual_a -gt $(($expected_a + $tolerance)) ]]; then
|
|
||||||
echo actual a = $((${actual_a%% *} / 1024 / 1024)) MB
|
|
||||||
echo expected a = $((${expected_a%% *} / 1024 / 1024)) MB
|
|
||||||
echo fail
|
|
||||||
|
|
||||||
cleanup
|
if [[ -n "$expected_b" && -n "$expected_b_hugetlb" ]]; then
|
||||||
exit 1
|
assert_with_retry "$CGROUP_ROOT/a/b/memory.$usage_file" "$expected_b"
|
||||||
fi
|
assert_with_retry "$CGROUP_ROOT/a/b/hugetlb.${MB}MB.$usage_file" "$expected_b_hugetlb"
|
||||||
|
|
||||||
local actual_a_hugetlb
|
|
||||||
actual_a_hugetlb="$(cat "$CGROUP_ROOT"/a/hugetlb.${MB}MB.$usage_file)"
|
|
||||||
if [[ $actual_a_hugetlb -lt $(($expected_a_hugetlb - $tolerance)) ]] ||
|
|
||||||
[[ $actual_a_hugetlb -gt $(($expected_a_hugetlb + $tolerance)) ]]; then
|
|
||||||
echo actual a hugetlb = $((${actual_a_hugetlb%% *} / 1024 / 1024)) MB
|
|
||||||
echo expected a hugetlb = $((${expected_a_hugetlb%% *} / 1024 / 1024)) MB
|
|
||||||
echo fail
|
|
||||||
|
|
||||||
cleanup
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "$expected_b" || -z "$expected_b_hugetlb" ]]; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local actual_b
|
|
||||||
actual_b="$(cat "$CGROUP_ROOT"/a/b/memory.$usage_file)"
|
|
||||||
if [[ $actual_b -lt $(($expected_b - $tolerance)) ]] ||
|
|
||||||
[[ $actual_b -gt $(($expected_b + $tolerance)) ]]; then
|
|
||||||
echo actual b = $((${actual_b%% *} / 1024 / 1024)) MB
|
|
||||||
echo expected b = $((${expected_b%% *} / 1024 / 1024)) MB
|
|
||||||
echo fail
|
|
||||||
|
|
||||||
cleanup
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
local actual_b_hugetlb
|
|
||||||
actual_b_hugetlb="$(cat "$CGROUP_ROOT"/a/b/hugetlb.${MB}MB.$usage_file)"
|
|
||||||
if [[ $actual_b_hugetlb -lt $(($expected_b_hugetlb - $tolerance)) ]] ||
|
|
||||||
[[ $actual_b_hugetlb -gt $(($expected_b_hugetlb + $tolerance)) ]]; then
|
|
||||||
echo actual b hugetlb = $((${actual_b_hugetlb%% *} / 1024 / 1024)) MB
|
|
||||||
echo expected b hugetlb = $((${expected_b_hugetlb%% *} / 1024 / 1024)) MB
|
|
||||||
echo fail
|
|
||||||
|
|
||||||
cleanup
|
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,7 +164,6 @@ size=$((${MB} * 1024 * 1024 * 25)) # 50MB = 25 * 2MB hugepages.
|
|||||||
|
|
||||||
cleanup
|
cleanup
|
||||||
|
|
||||||
echo
|
|
||||||
echo
|
echo
|
||||||
echo Test charge, rmdir, uncharge
|
echo Test charge, rmdir, uncharge
|
||||||
setup
|
setup
|
||||||
@@ -195,7 +184,6 @@ cleanup
|
|||||||
|
|
||||||
echo done
|
echo done
|
||||||
echo
|
echo
|
||||||
echo
|
|
||||||
if [[ ! $cgroup2 ]]; then
|
if [[ ! $cgroup2 ]]; then
|
||||||
echo "Test parent and child hugetlb usage"
|
echo "Test parent and child hugetlb usage"
|
||||||
setup
|
setup
|
||||||
@@ -212,7 +200,6 @@ if [[ ! $cgroup2 ]]; then
|
|||||||
assert_state 0 $(($size * 2)) 0 $size
|
assert_state 0 $(($size * 2)) 0 $size
|
||||||
|
|
||||||
rmdir "$CGROUP_ROOT"/a/b
|
rmdir "$CGROUP_ROOT"/a/b
|
||||||
sleep 5
|
|
||||||
echo Assert memory reparent correctly.
|
echo Assert memory reparent correctly.
|
||||||
assert_state 0 $(($size * 2))
|
assert_state 0 $(($size * 2))
|
||||||
|
|
||||||
@@ -224,7 +211,6 @@ if [[ ! $cgroup2 ]]; then
|
|||||||
cleanup
|
cleanup
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
|
||||||
echo
|
echo
|
||||||
echo "Test child only hugetlb usage"
|
echo "Test child only hugetlb usage"
|
||||||
echo setup
|
echo setup
|
||||||
|
|||||||
Reference in New Issue
Block a user