mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 01:08:13 -04:00
init/initramfs_test: wait_for_initramfs() before running
initramfs_test_extract() and friends call unpack_to_rootfs() from a
kunit kthread while do_populate_rootfs() may still be running
asynchronously from rootfs_initcall. unpack_to_rootfs() keeps its
parser state in module-static variables (victim, byte_count, state,
this_header, header_buf, name_buf, ...), so the two writers corrupt
each other.
On arm64 v7.0-rc5+ this oopses early in boot:
Unable to handle kernel paging request at virtual address ffff80018f9f0ffc
pc : do_reset+0x3c/0x98
Call trace:
do_reset
initramfs_test_extract
kunit_try_run_case
Initramfs unpacking failed: junk within compressed archive
do_reset() faults because 'victim' was overwritten by the boot-time
unpacker; the boot unpacker meanwhile logs the bogus "junk within
compressed archive" on the real initrd because the test wrecked its
state machine.
Add a .suite_init callback that calls wait_for_initramfs() so the async
unpack is quiescent before the first case runs. suite_init runs once per
suite rather than before every individual test case.
Fixes: 83c0b27266 ("initramfs_test: kunit tests for initramfs unpacking")
Signed-off-by: Jia He <justin.he@arm.com>
Link: https://patch.msgid.link/20260519093937.1064628-1-justin.he@arm.com
Reviewed-by: David Disseldorp <ddiss@suse.de>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
This commit is contained in:
committed by
Christian Brauner
parent
988c918b81
commit
ec3f4e0443
@@ -3,7 +3,9 @@
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/init_syscalls.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/timekeeping.h>
|
||||
#include "initramfs_internal.h"
|
||||
@@ -560,8 +562,21 @@ static struct kunit_case __refdata initramfs_test_cases[] = {
|
||||
{},
|
||||
};
|
||||
|
||||
static struct kunit_suite initramfs_test_suite = {
|
||||
static int __init initramfs_test_init(struct kunit_suite *suite)
|
||||
{
|
||||
/*
|
||||
* unpack_to_rootfs() uses module-static state (victim, byte_count,
|
||||
* state, ...). The boot-time async do_populate_rootfs() may still be
|
||||
* running, so wait for it to finish before we call unpack_to_rootfs()
|
||||
* from the test thread, otherwise the two writers race and crash.
|
||||
*/
|
||||
wait_for_initramfs();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct kunit_suite __refdata initramfs_test_suite = {
|
||||
.name = "initramfs",
|
||||
.suite_init = initramfs_test_init,
|
||||
.test_cases = initramfs_test_cases,
|
||||
};
|
||||
kunit_test_init_section_suites(&initramfs_test_suite);
|
||||
|
||||
Reference in New Issue
Block a user