automated: linux: modules: add kmemleak-based cumulative leak detection
Enhance cumulative leak detection by integrating kmemleak scanning as the
primary detection method, with MemAvailable fallback for systems without
kmemleak support.
The function now:
- Uses kmemleak scan after all iterations complete to detect cumulative leaks
- Reports kmemleak_{module} results instead of memcheck_{module} when available
- Clears kmemleak state after each module to prevent cross-contamination
- Falls back to MemAvailable-based detection when kmemleak unavailable
This provides more accurate memory leak detection using the kernel's native
leak detector while maintaining backward compatibility with systems that
don't have kmemleak enabled.
Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
diff --git a/automated/linux/modules/modules.sh b/automated/linux/modules/modules.sh
index 0f926c0..63fead8 100755
--- a/automated/linux/modules/modules.sh
+++ b/automated/linux/modules/modules.sh
@@ -49,13 +49,33 @@
local module=$1
local mem_start=$2
local mem_end=$3
- local diff_kb
- diff_kb=$((mem_start - mem_end))
- echo "memcheck cumulative: start ${mem_start}, end ${mem_end}, diff ${diff_kb}"
- if [ "$diff_kb" -lt "-${MEMORY_TOLERANCE}" ]; then
- report_fail "memcheck_${module}"
+
+ if [ -e /sys/kernel/debug/kmemleak ]; then
+ # Trigger scan after all iterations complete
+ echo scan > /sys/kernel/debug/kmemleak
+ sleep 3
+
+ # Check for cumulative leaks from all iterations
+ if grep -q "." /sys/kernel/debug/kmemleak; then
+ echo "Cumulative memory leak detected for module ${module}:"
+ cat /sys/kernel/debug/kmemleak
+ report_fail "kmemleak_${module}"
+ else
+ report_pass "kmemleak_${module}"
+ fi
+
+ # Clear leaks for next module
+ echo clear > /sys/kernel/debug/kmemleak
else
- report_pass "memcheck_${module}"
+ # Fallback: aggregate memory check (not per-iteration)
+ local diff_kb
+ diff_kb=$((mem_start - mem_end))
+ echo "memcheck cumulative: start ${mem_start}, end ${mem_end}, diff ${diff_kb}"
+ if [ "$diff_kb" -lt "-${MEMORY_TOLERANCE}" ]; then
+ report_fail "memcheck_${module}"
+ else
+ report_pass "memcheck_${module}"
+ fi
fi
}