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 <li...@weissschuh.net>
> ---
> 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-4416ecedc...@weissschuh.net
> ---

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 <nico...@fjasle.eu>


>  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 <li...@weissschuh.net>

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

Reply via email to