From 218824866beb9669e198101c7fda4c8bcce7c11c Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 3 Nov 2017 19:22:13 +0100 Subject: qemu: check for memory leaks --- src/tests/qemu/Makefile | 2 +- src/tests/qemu/debug.config | 8 +++----- src/tests/qemu/init.c | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/tests/qemu/Makefile b/src/tests/qemu/Makefile index 4261b89..0469b3a 100644 --- a/src/tests/qemu/Makefile +++ b/src/tests/qemu/Makefile @@ -169,7 +169,7 @@ qemu: $(KERNEL_BZIMAGE) -nographic \ -smp $(NR_CPUS) \ $(QEMU_MACHINE) \ - -m 192M \ + -m $$(grep -q CONFIG_DEBUG_KMEMLEAK=y $(KERNEL_PATH)/.config && echo 1G || echo 192M) \ -serial stdio \ -serial file:$(BUILD_PATH)/result \ -no-reboot \ diff --git a/src/tests/qemu/debug.config b/src/tests/qemu/debug.config index 1dc8a27..ac20063 100644 --- a/src/tests/qemu/debug.config +++ b/src/tests/qemu/debug.config @@ -26,10 +26,9 @@ CONFIG_KASAN_INLINE=y CONFIG_UBSAN=y CONFIG_UBSAN_SANITIZE_ALL=y CONFIG_UBSAN_NULL=y -CONFIG_KMEMCHECK=y -CONFIG_KMEMCHECK_PARTIAL_OK=y -CONFIG_KMEMCHECK_BITOPS_OK=y -CONFIG_ARCH_HAS_KCOV=y +CONFIG_DEBUG_KMEMLEAK=y +CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=8192 +CONFIG_DEBUG_STACK_USAGE=y CONFIG_KCOV=y CONFIG_DEBUG_SHIRQ=y CONFIG_WQ_WATCHDOG=y @@ -56,5 +55,4 @@ CONFIG_SPARSE_RCU_POINTER=y CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_TRACE=y CONFIG_RCU_EQS_DEBUG=y -CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y CONFIG_USER_STACKTRACE_SUPPORT=y diff --git a/src/tests/qemu/init.c b/src/tests/qemu/init.c index afbc611..8f46e6c 100644 --- a/src/tests/qemu/init.c +++ b/src/tests/qemu/init.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -207,6 +208,28 @@ static void ensure_console(void) panic("Unable to open console device"); } +static void check_leaks(void) +{ + int fd; + + if (mount("none", "/sys/kernel/debug", "debugfs", 0, NULL) < 0) + return; + fd = open("/sys/kernel/debug/kmemleak", O_WRONLY); + if (fd < 0) + return; + pretty_message("[+] Scanning for memory leaks..."); + sleep(2); /* Wait for any grace periods. */ + write(fd, "scan\n", 5); + close(fd); + + fd = open("/sys/kernel/debug/kmemleak", O_RDONLY); + if (fd < 0) + return; + if (sendfile(1, fd, NULL, 0x7ffff000) > 0) + panic("Memory leaks encountered"); + close(fd); +} + int main(int argc, char *argv[]) { seed_rng(); @@ -216,6 +239,7 @@ int main(int argc, char *argv[]) kmod_selftests(); enable_logging(); launch_tests(); + check_leaks(); poweroff(); return 1; } -- cgit v1.2.3-59-g8ed1b