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>,
"Paul Walmsley" <paul.walmsley@sifive.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>,
"Nicolas Schier" <nicolas.schier@linux.dev>
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, linux-riscv@lists.infradead.org,
workflows@vger.kernel.org,
"Thomas Weißschuh" <thomas.weissschuh@linutronix.de>
Subject: [PATCH v3 15/16] kunit: uapi: Introduce preinit executable
Date: Wed, 11 Jun 2025 09:38:21 +0200 [thread overview]
Message-ID: <20250611-kunit-kselftests-v3-15-55e3d148cbc6@linutronix.de> (raw)
In-Reply-To: <20250611-kunit-kselftests-v3-0-55e3d148cbc6@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>
---
lib/kunit/Makefile | 9 ++++++-
lib/kunit/uapi-preinit.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++
lib/kunit/uapi.c | 11 +++++++--
3 files changed, 80 insertions(+), 3 deletions(-)
diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile
index e406a31df1df834a87961663de0b7921b59481c2..19493ec320c61e2ccbb58e8b2e943e9a4ec447e2 100644
--- a/lib/kunit/Makefile
+++ b/lib/kunit/Makefile
@@ -12,7 +12,14 @@ kunit-objs += test.o \
device.o \
platform.o
-kunit-$(CONFIG_KUNIT_UAPI) += uapi.o
+userprogs += uapi-preinit
+uapi-preinit-nolibc := $(CONFIG_ARCH_HAS_NOLIBC)
+uapi-preinit-userccflags += -static \
+ -include include/generated/autoconf.h \
+ -include $(srctree)/tools/include/linux/kconfig.h
+blobs += uapi-preinit.blob.o
+uapi-preinit.blob-symbol := kunit_uapi_preinit
+kunit-$(CONFIG_KUNIT_UAPI) += uapi.o uapi-preinit.blob.o
ifeq ($(CONFIG_KUNIT_DEBUGFS),y)
kunit-objs += debugfs.o
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;
+}
diff --git a/lib/kunit/uapi.c b/lib/kunit/uapi.c
index 121146dda533b3f90aca37c20bd0e7a1d20cb3b5..bccc081a6538507724c1ef340203cfd147170dc4 100644
--- a/lib/kunit/uapi.c
+++ b/lib/kunit/uapi.c
@@ -139,7 +139,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(BLOB(kunit_uapi_preinit)->path), argv, NULL);
if (!ctx->exec_err)
return 0;
do_exit(0);
@@ -239,6 +239,7 @@ static int kunit_uapi_run_executable_in_mount(struct kunit *test, const char *ex
static int kunit_uapi_run_executable(struct kunit *test, const struct blob *executable)
{
+ const struct blob *preinit = BLOB(kunit_uapi_preinit);
const char *exe_name = kbasename(executable->path);
struct vfsmount *mnt;
int err;
@@ -247,7 +248,13 @@ static int kunit_uapi_run_executable(struct kunit *test, const struct blob *exec
if (IS_ERR(mnt))
return PTR_ERR(mnt);
- err = kunit_uapi_write_file(mnt, exe_name, 0755, executable->data, blob_size(executable));
+ err = kunit_uapi_write_file(mnt, kbasename(preinit->path), 0755,
+ preinit->data,
+ blob_size(preinit));
+
+ if (!err)
+ err = kunit_uapi_write_file(mnt, exe_name, 0755,
+ executable->data, blob_size(executable));
if (!err)
err = kunit_uapi_run_executable_in_mount(test, exe_name, mnt);
--
2.49.0
next prev parent reply other threads:[~2025-06-11 7:38 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-11 7:38 [PATCH v3 00/16] kunit: Introduce UAPI testing framework Thomas Weißschuh
2025-06-11 7:38 ` [PATCH v3 01/16] kbuild: userprogs: avoid duplicating of flags inherited from kernel Thomas Weißschuh
2025-06-11 13:52 ` Nicolas Schier
2025-06-11 7:38 ` [PATCH v3 02/16] kbuild: userprogs: also inherit byte order and ABI " Thomas Weißschuh
2025-06-11 13:53 ` Nicolas Schier
2025-06-16 14:49 ` Masahiro Yamada
2025-06-17 7:39 ` Thomas Weißschuh
2025-06-18 1:14 ` Masahiro Yamada
2025-06-11 7:38 ` [PATCH v3 03/16] init: re-add CONFIG_CC_CAN_LINK_STATIC Thomas Weißschuh
2025-06-11 14:04 ` Nicolas Schier
2025-06-11 7:38 ` [PATCH v3 04/16] kbuild: userprogs: add nolibc support Thomas Weißschuh
2025-06-11 14:09 ` Nicolas Schier
2025-06-16 15:35 ` Masahiro Yamada
2025-06-17 7:59 ` Thomas Weißschuh
2025-06-18 1:15 ` Masahiro Yamada
2025-06-11 7:38 ` [PATCH v3 05/16] kbuild: introduce CONFIG_ARCH_HAS_NOLIBC Thomas Weißschuh
2025-06-11 7:38 ` [PATCH v3 06/16] kbuild: doc: add label for userprogs section Thomas Weißschuh
2025-06-11 7:38 ` [PATCH v3 07/16] kbuild: introduce blob framework Thomas Weißschuh
2025-06-16 15:38 ` Masahiro Yamada
2025-06-17 7:50 ` Thomas Weißschuh
2025-06-11 7:38 ` [PATCH v3 08/16] kunit: tool: Add test for nested test result reporting Thomas Weißschuh
2025-06-20 9:37 ` David Gow
2025-06-20 13:20 ` Thomas Weißschuh
2025-06-11 7:38 ` [PATCH v3 09/16] kunit: tool: Don't overwrite test status based on subtest counts Thomas Weißschuh
2025-06-20 9:37 ` David Gow
2025-06-20 13:23 ` Thomas Weißschuh
2025-06-11 7:38 ` [PATCH v3 10/16] kunit: tool: Parse skipped tests from kselftest.h Thomas Weißschuh
2025-06-20 9:37 ` David Gow
2025-06-11 7:38 ` [PATCH v3 11/16] kunit: Always descend into kunit directory during build Thomas Weißschuh
2025-06-20 9:47 ` David Gow
2025-06-11 7:38 ` [PATCH v3 12/16] kunit: qemu_configs: loongarch: Enable LSX/LSAX Thomas Weißschuh
2025-06-20 9:37 ` David Gow
2025-06-11 7:38 ` [PATCH v3 13/16] kunit: Introduce UAPI testing framework Thomas Weißschuh
2025-06-20 9:47 ` David Gow
2025-06-20 13:43 ` Thomas Weißschuh
2025-06-11 7:38 ` [PATCH v3 14/16] kunit: uapi: Add example for UAPI tests Thomas Weißschuh
2025-06-20 9:47 ` David Gow
2025-06-11 7:38 ` Thomas Weißschuh [this message]
2025-06-20 9:48 ` [PATCH v3 15/16] kunit: uapi: Introduce preinit executable David Gow
2025-06-11 7:38 ` [PATCH v3 16/16] kunit: uapi: Validate usability of /proc Thomas Weißschuh
2025-06-20 9:48 ` David Gow
2025-06-20 13:50 ` Thomas Weißschuh
2025-06-20 9:37 ` [PATCH v3 00/16] kunit: Introduce UAPI testing framework David Gow
2025-06-20 13:18 ` Thomas Weißschuh
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=20250611-kunit-kselftests-v3-15-55e3d148cbc6@linutronix.de \
--to=thomas.weissschuh@linutronix.de \
--cc=akpm@linux-foundation.org \
--cc=alex@ghiti.fr \
--cc=aou@eecs.berkeley.edu \
--cc=brendan.higgins@linux.dev \
--cc=christophe.leroy@csgroup.eu \
--cc=corbet@lwn.net \
--cc=davidgow@google.com \
--cc=kunit-dev@googlegroups.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux@weissschuh.net \
--cc=masahiroy@kernel.org \
--cc=nathan@kernel.org \
--cc=nicolas.schier@linux.dev \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=rmoar@google.com \
--cc=shuah@kernel.org \
--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).