selftests/damon/sysfs_memcg_path_leak.sh: use kmemleak

Patch series "selftests/damon: improve leak detection and wss estimation
reliability".

Two DAMON selftets, namely 'sysfs_memcg_leak' and
'sysfs_update_schemes_tried_regions_wss_estimation' frequently show
intermittent failures due to their unreliable leak detection and working
set size estimation.  Make those more reliable.


This patch (of 5):

sysfs_memcg_path_leak.sh determines if the memory leak has happened by
seeing if Slab size on /proc/meminfo increases more than expected after an
action.  Depending on the system and background workloads, the reasonable
expectation varies.  For the reason, the test frequently shows
intermittent failures.  Use kmemleak, which is much more reliable and
correct, instead.

Link: https://lkml.kernel.org/r/20260117020731.226785-1-sj@kernel.org
Link: https://lkml.kernel.org/r/20260117020731.226785-2-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
SeongJae Park
2026-01-16 18:07:24 -08:00
committed by Andrew Morton
parent dd2c6ec24f
commit 94a62284ed

View File

@@ -14,6 +14,13 @@ then
exit $ksft_skip
fi
kmemleak="/sys/kernel/debug/kmemleak"
if [ ! -f "$kmemleak" ]
then
echo "$kmemleak not found"
exit $ksft_skip
fi
# ensure filter directory
echo 1 > "$damon_sysfs/kdamonds/nr_kdamonds"
echo 1 > "$damon_sysfs/kdamonds/0/contexts/nr_contexts"
@@ -22,22 +29,17 @@ echo 1 > "$damon_sysfs/kdamonds/0/contexts/0/schemes/0/filters/nr_filters"
filter_dir="$damon_sysfs/kdamonds/0/contexts/0/schemes/0/filters/0"
before_kb=$(grep Slab /proc/meminfo | awk '{print $2}')
# try to leak 3000 KiB
for i in {1..102400};
# try to leak 128 times
for i in {1..128};
do
echo "012345678901234567890123456789" > "$filter_dir/memcg_path"
done
after_kb=$(grep Slab /proc/meminfo | awk '{print $2}')
# expect up to 1500 KiB free from other tasks memory
expected_after_kb_max=$((before_kb + 1500))
if [ "$after_kb" -gt "$expected_after_kb_max" ]
echo scan > "$kmemleak"
kmemleak_report=$(cat "$kmemleak")
if [ "$kmemleak_report" = "" ]
then
echo "maybe memcg_path are leaking: $before_kb -> $after_kb"
exit 1
else
exit 0
fi
echo "$kmemleak_report"
exit 1