From: Muhammad Usama Anjum <usama.anjum@collabora.com>
To: "Thomas Weißschuh" <thomas.weissschuh@linutronix.de>,
"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>
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
Subject: Re: [PATCH v4 14/15] kunit: uapi: Introduce preinit executable
Date: Sat, 12 Jul 2025 14:49:38 +0500 [thread overview]
Message-ID: <dc205138-3f68-4073-aeb3-3e2e67c15da4@collabora.com> (raw)
In-Reply-To: <20250626-kunit-kselftests-v4-14-48760534fef5@linutronix.de>
On 6/26/25 11:10 AM, Thomas WeiÃschuh wrote:
> 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.
From perspective of kselftests, I've liked the approach. Once we have an
automated way to run all the tests by some simple stubs, it would solve
the inherent problem of kselftests that it require different config options
enabled before tests can run. Hopefully, they would be auto enabled / disabled as
kernel config changes.
Acked-by: Muhammad Usama Anjum <usama.anjum@collabora.com>
>
> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
> Reviewed-by: David Gow <davidgow@google.com>
> ---
> MAINTAINERS | 1 +
> lib/kunit/Makefile | 6 +++++
> lib/kunit/kunit-uapi.c | 9 +++++--
> lib/kunit/uapi-preinit.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 77 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 1bba7965613e36e26939d6b31e1d65acf5bad0dc..b50f3bc8bc7f3ade03be4900d9163d7a0d96863c 100644
> --- a/lib/kunit/Makefile
> +++ b/lib/kunit/Makefile
> @@ -14,8 +14,14 @@ 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
>
> +$(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 cfe8440e16fde942a5f0fa7ac9d8ab90a737215b..7c87605b9ded9dbeb3968af8a8f4650ab5938887 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));
Positive error values are passed to strerror() without the - sign in userspace.
Probably - needs to be removed from strerror() here.
> + 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;
> +}
>
next prev parent reply other threads:[~2025-07-12 9:50 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-26 6:10 [PATCH v4 00/15] kunit: Introduce UAPI testing framework Thomas Weißschuh
2025-06-26 6:10 ` [PATCH v4 01/15] kbuild: userprogs: avoid duplication of flags inherited from kernel Thomas Weißschuh
2025-07-03 13:59 ` Nicolas Schier
2025-07-04 21:51 ` Masahiro Yamada
2025-06-26 6:10 ` [PATCH v4 02/15] kbuild: userprogs: also inherit byte order and ABI " Thomas Weißschuh
2025-07-03 14:00 ` Nicolas Schier
2025-07-04 21:51 ` Masahiro Yamada
2025-06-26 6:10 ` [PATCH v4 03/15] kbuild: doc: add label for userprogs section Thomas Weißschuh
2025-07-03 14:00 ` Nicolas Schier
2025-07-04 21:55 ` Masahiro Yamada
2025-06-26 6:10 ` [PATCH v4 04/15] init: re-add CONFIG_CC_CAN_LINK_STATIC Thomas Weißschuh
2025-07-03 14:00 ` Nicolas Schier
2025-07-04 21:55 ` Masahiro Yamada
2025-06-26 6:10 ` [PATCH v4 05/15] init: add nolibc build support Thomas Weißschuh
2025-07-03 14:01 ` Nicolas Schier
2025-06-26 6:10 ` [PATCH v4 06/15] fs,fork,exit: export symbols necessary for KUnit UAPI support Thomas Weißschuh
2025-07-11 10:35 ` Thomas Weißschuh
2025-07-11 15:44 ` Al Viro
2025-07-14 5:52 ` Thomas Weißschuh
2025-07-14 8:12 ` Christian Brauner
2025-07-16 5:30 ` Thomas Weißschuh
2025-07-16 6:21 ` Christoph Hellwig
2025-07-16 8:39 ` Thomas Weißschuh
2025-07-16 11:11 ` Christoph Hellwig
2025-07-16 11:33 ` Thomas Weißschuh
2025-07-16 11:36 ` Christoph Hellwig
2025-07-16 12:47 ` Thomas Weißschuh
2025-07-16 12:57 ` Christoph Hellwig
2025-06-26 6:10 ` [PATCH v4 07/15] kunit: tool: Add test for nested test result reporting Thomas Weißschuh
2025-07-01 21:26 ` Rae Moar
2025-06-26 6:10 ` [PATCH v4 08/15] kunit: tool: Don't overwrite test status based on subtest counts Thomas Weißschuh
2025-07-01 21:11 ` Rae Moar
2025-07-03 15:29 ` Thomas Weißschuh
2025-07-04 12:55 ` Thomas Weißschuh
2025-06-26 6:10 ` [PATCH v4 09/15] kunit: tool: Parse skipped tests from kselftest.h Thomas Weißschuh
2025-07-01 21:22 ` Rae Moar
2025-07-03 15:59 ` Thomas Weißschuh
2025-06-26 6:10 ` [PATCH v4 10/15] kunit: Always descend into kunit directory during build Thomas Weißschuh
2025-06-26 6:10 ` [PATCH v4 11/15] kunit: qemu_configs: loongarch: Enable LSX/LSAX Thomas Weißschuh
2025-06-26 6:10 ` [PATCH v4 12/15] kunit: Introduce UAPI testing framework Thomas Weißschuh
2025-06-26 18:11 ` Benjamin Berg
2025-06-27 4:20 ` Thomas Weißschuh
2025-06-27 6:58 ` Benjamin Berg
2025-06-27 8:27 ` Thomas Weißschuh
2025-06-26 6:10 ` [PATCH v4 13/15] kunit: uapi: Add example for UAPI tests Thomas Weißschuh
2025-06-26 6:10 ` [PATCH v4 14/15] kunit: uapi: Introduce preinit executable Thomas Weißschuh
2025-07-12 9:49 ` Muhammad Usama Anjum [this message]
2025-06-26 6:10 ` [PATCH v4 15/15] kunit: uapi: Validate usability of /proc Thomas Weißschuh
2025-07-07 18:18 ` [PATCH v4 00/15] kunit: Introduce UAPI testing framework Jonathan Corbet
2025-07-08 5:51 ` 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=dc205138-3f68-4073-aeb3-3e2e67c15da4@collabora.com \
--to=usama.anjum@collabora.com \
--cc=akpm@linux-foundation.org \
--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@weissschuh.net \
--cc=masahiroy@kernel.org \
--cc=nathan@kernel.org \
--cc=nicolas.schier@linux.dev \
--cc=rmoar@google.com \
--cc=shuah@kernel.org \
--cc=thomas.weissschuh@linutronix.de \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.