From: "Thomas Weißschuh" <thomas.weissschuh@linutronix.de>
To: "Masahiro Yamada" <masahiroy@kernel.org>,
"Nathan Chancellor" <nathan@kernel.org>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Willy Tarreau" <w@1wt.eu>,
"Thomas Weißschuh" <linux@weissschuh.net>,
"Brendan Higgins" <brendan.higgins@linux.dev>,
"David Gow" <davidgow@google.com>, "Rae Moar" <rmoar@google.com>,
"Shuah Khan" <shuah@kernel.org>,
"Jonathan Corbet" <corbet@lwn.net>,
"Nicolas Schier" <nicolas.schier@linux.dev>,
"Kees Cook" <kees@kernel.org>,
"Alexander Viro" <viro@zeniv.linux.org.uk>,
"Christian Brauner" <brauner@kernel.org>,
"Jan Kara" <jack@suse.cz>, "Christoph Hellwig" <hch@lst.de>,
"Luis Chamberlain" <mcgrof@kernel.org>
Cc: "Christophe Leroy" <christophe.leroy@csgroup.eu>,
linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com,
linux-doc@vger.kernel.org, workflows@vger.kernel.org,
linux-mm@kvack.org, linux-fsdevel@vger.kernel.org,
"Thomas Weißschuh" <thomas.weissschuh@linutronix.de>,
"Nicolas Schier" <nicolas.schier@linux.dev>
Subject: [PATCH v5 14/15] kunit: uapi: Introduce preinit executable
Date: Thu, 17 Jul 2025 10:48:16 +0200 [thread overview]
Message-ID: <20250717-kunit-kselftests-v5-14-442b711cde2e@linutronix.de> (raw)
In-Reply-To: <20250717-kunit-kselftests-v5-0-442b711cde2e@linutronix.de>
UAPI selftests may expect a "normal" userspace environment.
For example the normal kernel API pseudo-filesystems should be mounted.
This could be done from kernel code but it is non-idiomatic.
Add a preinit userspace executable which performs these setup steps
before running the final test executable.
This preinit executable is only ever run from the kernel.
Give it access to autoconf.h and kconfig.h to adapt itself to the
tested kernel.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Reviewed-by: David Gow <davidgow@google.com>
---
MAINTAINERS | 1 +
lib/kunit/Makefile | 7 ++++++
lib/kunit/kunit-uapi.c | 9 +++++--
lib/kunit/uapi-preinit.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 78 insertions(+), 2 deletions(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index b1405f0a0e638d1654d9dc9e51d784ddc838cf5b..e81dfa180ab374ef91c7a45e546e6e9a8f454fa7 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13546,6 +13546,7 @@ S: Maintained
F: include/kunit/uapi.h
F: lib/kunit/kunit-example-uapi.c
F: lib/kunit/kunit-uapi.c
+F: lib/kunit/uapi-preinit.c
KVM PARAVIRT (KVM/paravirt)
M: Paolo Bonzini <pbonzini@redhat.com>
diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile
index 2434470e998525e5667ebc207d11659835b5e888..e52a31b0852caef5669f11f6059c29ce5911aa43 100644
--- a/lib/kunit/Makefile
+++ b/lib/kunit/Makefile
@@ -14,8 +14,15 @@ kunit-objs += test.o \
device.o \
platform.o
+userprogs += uapi-preinit
+uapi-preinit-userccflags += -static $(NOLIBC_USERCFLAGS) \
+ -include include/generated/autoconf.h \
+ -include $(srctree)/tools/include/linux/kconfig.h
obj-$(CONFIG_KUNIT_UAPI) += kunit-uapi.o
+CFLAGS_kunit-uapi.o := -Wa,-I$(obj)
+$(obj)/kunit-uapi.o: $(obj)/uapi-preinit
+
ifeq ($(CONFIG_KUNIT_DEBUGFS),y)
kunit-objs += debugfs.o
endif
diff --git a/lib/kunit/kunit-uapi.c b/lib/kunit/kunit-uapi.c
index 24356f68eca0df07032fb8a9e92daffde01b21d3..382a2bfee3c78a6e042a56a9ccdefcd55b5265a1 100644
--- a/lib/kunit/kunit-uapi.c
+++ b/lib/kunit/kunit-uapi.c
@@ -25,6 +25,8 @@
#define KSFT_XPASS 3
#define KSFT_SKIP 4
+KUNIT_UAPI_EMBED_BLOB(kunit_uapi_preinit, "uapi-preinit");
+
static struct vfsmount *kunit_uapi_mount_ramfs(void)
{
struct file_system_type *type;
@@ -146,7 +148,7 @@ static int kunit_uapi_user_mode_thread_init(void *data)
kernel_sigaction(SIGABRT, SIG_DFL);
complete(&ctx->setup_done);
- ctx->exec_err = kernel_execve(ctx->executable, argv, NULL);
+ ctx->exec_err = kernel_execve(kbasename(kunit_uapi_preinit.path), argv, NULL);
if (!ctx->exec_err)
return 0;
do_exit(0);
@@ -255,7 +257,10 @@ static int kunit_uapi_run_executable(struct kunit *test,
if (IS_ERR(mnt))
return PTR_ERR(mnt);
- err = kunit_uapi_write_executable(mnt, executable);
+ err = kunit_uapi_write_executable(mnt, &kunit_uapi_preinit);
+
+ if (!err)
+ err = kunit_uapi_write_executable(mnt, executable);
if (!err)
err = kunit_uapi_run_executable_in_mount(test, exe_name, mnt);
diff --git a/lib/kunit/uapi-preinit.c b/lib/kunit/uapi-preinit.c
new file mode 100644
index 0000000000000000000000000000000000000000..81182039965a8c93aebb2d5d76f4113bfef277a6
--- /dev/null
+++ b/lib/kunit/uapi-preinit.c
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * KUnit Userspace environment setup.
+ *
+ * Copyright (C) 2025, Linutronix GmbH.
+ * Author: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
+ *
+ * This is *userspace* code.
+ */
+
+#include <sys/mount.h>
+#include <sys/stat.h>
+
+#include "../../tools/testing/selftests/kselftest.h"
+
+static int setup_api_mount(const char *target, const char *fstype)
+{
+ int ret;
+
+ ret = mkdir(target, 0755);
+ if (ret && errno != EEXIST)
+ return -errno;
+
+ ret = mount("none", target, fstype, 0, NULL);
+ if (ret && errno != EBUSY)
+ return -errno;
+
+ return 0;
+}
+
+static void exit_failure(const char *stage, int err)
+{
+ /* If preinit fails synthesize a failed test report. */
+ ksft_print_header();
+ ksft_set_plan(1);
+ ksft_test_result_fail("Failed during test setup: %s: %s\n", stage, strerror(-err));
+ ksft_finished();
+}
+
+int main(int argc, char **argv, char **envp)
+{
+ int ret;
+
+ ret = setup_api_mount("/proc", "proc");
+ if (ret)
+ exit_failure("mount /proc", ret);
+
+ ret = setup_api_mount("/sys", "sysfs");
+ if (ret)
+ exit_failure("mount /sys", ret);
+
+ if (IS_ENABLED(CONFIG_DEVTMPFS)) {
+ ret = setup_api_mount("/dev", "devtmpfs");
+ if (ret)
+ exit_failure("mount /dev", ret);
+ }
+
+ ret = execve(argv[0], argv, envp);
+ if (ret)
+ exit_failure("execve", ret);
+
+ return 0;
+}
--
2.50.0
next prev parent reply other threads:[~2025-07-17 8:49 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-17 8:48 [PATCH v5 00/15] kunit: Introduce UAPI testing framework Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 01/15] kbuild: userprogs: avoid duplication of flags inherited from kernel Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 02/15] kbuild: userprogs: also inherit byte order and ABI " Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 03/15] kbuild: doc: add label for userprogs section Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 04/15] init: re-add CONFIG_CC_CAN_LINK_STATIC Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 05/15] init: add nolibc build support Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 06/15] fs,fork,exit: export symbols necessary for KUnit UAPI support Thomas Weißschuh
2025-07-18 16:44 ` Al Viro
2025-07-21 6:42 ` Thomas Weißschuh
2025-07-21 7:20 ` Christoph Hellwig
2025-07-17 8:48 ` [PATCH v5 07/15] kunit: tool: Add test for nested test result reporting Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 08/15] kunit: tool: Don't overwrite test status based on subtest counts Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 09/15] kunit: tool: Parse skipped tests from kselftest.h Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 10/15] kunit: Always descend into kunit directory during build Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 11/15] kunit: qemu_configs: loongarch: Enable LSX/LSAX Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 12/15] kunit: Introduce UAPI testing framework Thomas Weißschuh
2025-07-17 8:48 ` [PATCH v5 13/15] kunit: uapi: Add example for UAPI tests Thomas Weißschuh
2025-07-17 8:48 ` Thomas Weißschuh [this message]
2025-07-17 8:48 ` [PATCH v5 15/15] kunit: uapi: Validate usability of /proc Thomas Weißschuh
2025-07-17 13:23 ` [PATCH v5 00/15] kunit: Introduce UAPI testing framework Christoph Hellwig
2025-07-17 13:49 ` Mark Brown
2025-07-18 6:22 ` Thomas Weißschuh
2025-07-21 7:09 ` Christoph Hellwig
2025-08-04 15:01 ` Thomas Weißschuh
2025-08-12 9:41 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250717-kunit-kselftests-v5-14-442b711cde2e@linutronix.de \
--to=thomas.weissschuh@linutronix.de \
--cc=akpm@linux-foundation.org \
--cc=brauner@kernel.org \
--cc=brendan.higgins@linux.dev \
--cc=christophe.leroy@csgroup.eu \
--cc=corbet@lwn.net \
--cc=davidgow@google.com \
--cc=hch@lst.de \
--cc=jack@suse.cz \
--cc=kees@kernel.org \
--cc=kunit-dev@googlegroups.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux@weissschuh.net \
--cc=masahiroy@kernel.org \
--cc=mcgrof@kernel.org \
--cc=nathan@kernel.org \
--cc=nicolas.schier@linux.dev \
--cc=rmoar@google.com \
--cc=shuah@kernel.org \
--cc=viro@zeniv.linux.org.uk \
--cc=w@1wt.eu \
--cc=workflows@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).