Re: [PATCH RFC v2] selftests/nolibc: don't embed initramfs into kernel image

From: Nicolas Schier
Date: Tue Sep 19 2023 - 07:48:52 EST


On Sun, Sep 17, 2023 at 05:21:38PM +0200 Thomas Weißschuh wrote:
> When the initramfs is embedded into the kernel each rebuild of it will
> trigger a full kernel relink and all the expensive postprocessing steps.
>
> Currently nolibc-test and therefore the initramfs are always rebuild,
> even without source changes, leading to lots of slow kernel relinks.
>
> Instead of linking the initramfs into the kernel assemble it manually
> and pass it explicitly to qemu.
> This avoids all of the kernel relinks.
>
> Signed-off-by: Thomas Weißschuh <linux@xxxxxxxxxxxxxx>
> ---
> Currently the nolibc testsuite embeds the test executable into a kernel
> image with CONFIG_INITRAMFS_SOURCE.
> This forces a full kernel relink everytime the test executable is
> updated.
>
> This relinking step dominates the test cycle.
> It is slower than building and running the test in qemu together.
>
> With a bit of Makefile-shuffling the relinking can be avoided.
> ---
> Changes in v2:
> - avoid need to modify top-level Makefile
> - drop patch removing "rerun" target
> - add kernel-standalone target
> - Link to v1: https://lore.kernel.org/r/20230916-nolibc-initramfs-v1-0-4416ecedca6d@xxxxxxxxxxxxxx
> ---

Thanks, seems to work as described (and I am surprised how fast the 'run'
target is) and patch looks good to me.

Reviewed-by: Nicolas Schier <nicolas@xxxxxxxxx>


> tools/testing/selftests/nolibc/Makefile | 42 ++++++++++++++++++++-------------
> 1 file changed, 26 insertions(+), 16 deletions(-)
>
> diff --git a/tools/testing/selftests/nolibc/Makefile b/tools/testing/selftests/nolibc/Makefile
> index 689658f81a19..ee6a9ad28cfd 100644
> --- a/tools/testing/selftests/nolibc/Makefile
> +++ b/tools/testing/selftests/nolibc/Makefile
> @@ -131,18 +131,20 @@ REPORT ?= awk '/\[OK\][\r]*$$/{p++} /\[FAIL\][\r]*$$/{if (!f) printf("\n"); f++
>
> help:
> @echo "Supported targets under selftests/nolibc:"
> - @echo " all call the \"run\" target below"
> - @echo " help this help"
> - @echo " sysroot create the nolibc sysroot here (uses \$$ARCH)"
> - @echo " nolibc-test build the executable (uses \$$CC and \$$CROSS_COMPILE)"
> - @echo " libc-test build an executable using the compiler's default libc instead"
> - @echo " run-user runs the executable under QEMU (uses \$$XARCH, \$$TEST)"
> - @echo " initramfs prepare the initramfs with nolibc-test"
> - @echo " defconfig create a fresh new default config (uses \$$XARCH)"
> - @echo " kernel (re)build the kernel with the initramfs (uses \$$XARCH)"
> - @echo " run runs the kernel in QEMU after building it (uses \$$XARCH, \$$TEST)"
> - @echo " rerun runs a previously prebuilt kernel in QEMU (uses \$$XARCH, \$$TEST)"
> - @echo " clean clean the sysroot, initramfs, build and output files"
> + @echo " all call the \"run\" target below"
> + @echo " help this help"
> + @echo " sysroot create the nolibc sysroot here (uses \$$ARCH)"
> + @echo " nolibc-test build the executable (uses \$$CC and \$$CROSS_COMPILE)"
> + @echo " libc-test build an executable using the compiler's default libc instead"
> + @echo " run-user runs the executable under QEMU (uses \$$XARCH, \$$TEST)"
> + @echo " initramfs.cpio prepare the initramfs archive with nolibc-test"
> + @echo " initramfs prepare the initramfs tree with nolibc-test"
> + @echo " defconfig create a fresh new default config (uses \$$XARCH)"
> + @echo " kernel (re)build the kernel (uses \$$XARCH)"
> + @echo " kernel-standalone (re)build the kernel with the initramfs (uses \$$XARCH)"
> + @echo " run runs the kernel in QEMU after building it (uses \$$XARCH, \$$TEST)"
> + @echo " rerun runs a previously prebuilt kernel in QEMU (uses \$$XARCH, \$$TEST)"
> + @echo " clean clean the sysroot, initramfs, build and output files"
> @echo ""
> @echo "The output file is \"run.out\". Test ranges may be passed using \$$TEST."
> @echo ""
> @@ -195,6 +197,9 @@ run-user: nolibc-test
> $(Q)qemu-$(QEMU_ARCH) ./nolibc-test > "$(CURDIR)/run.out" || :
> $(Q)$(REPORT) $(CURDIR)/run.out
>
> +initramfs.cpio: kernel nolibc-test
> + $(QUIET_GEN)echo 'file /init nolibc-test 755 0 0' | $(srctree)/usr/gen_init_cpio - > initramfs.cpio
> +
> initramfs: nolibc-test
> $(QUIET_MKDIR)mkdir -p initramfs
> $(call QUIET_INSTALL, initramfs/init)
> @@ -203,17 +208,20 @@ initramfs: nolibc-test
> defconfig:
> $(Q)$(MAKE) -C $(srctree) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) mrproper $(DEFCONFIG) prepare
>
> -kernel: initramfs
> +kernel:
> + $(Q)$(MAKE) -C $(srctree) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) $(IMAGE_NAME)
> +
> +kernel-standalone: initramfs
> $(Q)$(MAKE) -C $(srctree) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) $(IMAGE_NAME) CONFIG_INITRAMFS_SOURCE=$(CURDIR)/initramfs
>
> # run the tests after building the kernel
> -run: kernel
> - $(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out"
> +run: kernel initramfs.cpio
> + $(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -initrd initramfs.cpio -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out"
> $(Q)$(REPORT) $(CURDIR)/run.out
>
> # re-run the tests from an existing kernel
> rerun:
> - $(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out"
> + $(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -initrd initramfs.cpio -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out"
> $(Q)$(REPORT) $(CURDIR)/run.out
>
> # report with existing test log
> @@ -227,6 +235,8 @@ clean:
> $(Q)rm -f nolibc-test
> $(call QUIET_CLEAN, libc-test)
> $(Q)rm -f libc-test
> + $(call QUIET_CLEAN, initramfs.cpio)
> + $(Q)rm -rf initramfs.cpio
> $(call QUIET_CLEAN, initramfs)
> $(Q)rm -rf initramfs
> $(call QUIET_CLEAN, run.out)
>
> ---
> base-commit: 3f79a57865b33f49fdae6655510bd27c8e6610e0
> change-id: 20230916-nolibc-initramfs-4fd00eac3256
>
> Best regards,
> --
> Thomas Weißschuh <linux@xxxxxxxxxxxxxx>

--
epost|xmpp: nicolas@xxxxxxxxx irc://oftc.net/nsc
↳ gpg: 18ed 52db e34f 860e e9fb c82b 7d97 0932 55a0 ce7f
-- frykten for herren er opphav til kunnskap --