diff mbox series

[RESEND,1/3] initramfs: move unnecessary memcmp from hot path

Message ID 20210721115153.28620-1-ddiss@suse.de (mailing list archive)
State New, archived
Headers show
Series [RESEND,1/3] initramfs: move unnecessary memcmp from hot path | expand

Commit Message

David Disseldorp July 21, 2021, 11:51 a.m. UTC
do_header() is called for each cpio entry and first checks for "newc"
magic before parsing further. The magic check includes a special case
error message if POSIX.1 ASCII (cpio -H odc) magic is detected. This
special case POSIX.1 check needn't be done in the hot path, so move it
under the non-newc-magic error path.

Signed-off-by: David Disseldorp <ddiss@suse.de>
---
 init/initramfs.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

Comments

David Disseldorp Aug. 4, 2021, 9:31 a.m. UTC | #1
Ping, any feedback on this change?

I think it's a no brainer, but for kicks I ran a few unrealistic micro
benchmarks on my laptop. Extraction time for a cpio image with 1M+
directories improved by 5ms (pre: 14.614s, post: 14.609s), when averaged
across 20 runs of:
  qemu-system-x86_64 -machine accel=kvm -smp cpus=1 -m 10240 \
        -kernel ~/linux/arch/x86/boot/bzImage \
        -initrd ./initrds/gen_cpio.out \
        -append "initramfs_async=0 console=ttyS0 panic=0" -nographic \
        | awk '/Trying to unpack rootfs/ {start_ts = $2};
               /Freeing initrd memory/ {end_ts = $2}
               END {printf "%f\n", end_ts - start_ts}'

Cheers, David

On Wed, 21 Jul 2021 13:51:51 +0200, David Disseldorp wrote:

> do_header() is called for each cpio entry and first checks for "newc"
> magic before parsing further. The magic check includes a special case
> error message if POSIX.1 ASCII (cpio -H odc) magic is detected. This
> special case POSIX.1 check needn't be done in the hot path, so move it
> under the non-newc-magic error path.
> 
> Signed-off-by: David Disseldorp <ddiss@suse.de>
> ---
>  init/initramfs.c | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/init/initramfs.c b/init/initramfs.c
> index af27abc59643..f01590cefa2d 100644
> --- a/init/initramfs.c
> +++ b/init/initramfs.c
> @@ -256,12 +256,11 @@ static int __init do_collect(void)
>  
>  static int __init do_header(void)
>  {
> -	if (memcmp(collected, "070707", 6)==0) {
> -		error("incorrect cpio method used: use -H newc option");
> -		return 1;
> -	}
>  	if (memcmp(collected, "070701", 6)) {
> -		error("no cpio magic");
> +		if (memcmp(collected, "070707", 6) == 0)
> +			error("incorrect cpio method used: use -H newc option");
> +		else
> +			error("no cpio magic");
>  		return 1;
>  	}
>  	parse_header(collected);
Al Viro Aug. 4, 2021, 12:57 p.m. UTC | #2
On Wed, Aug 04, 2021 at 11:31:29AM +0200, David Disseldorp wrote:
> Ping, any feedback on this change?
> 
> I think it's a no brainer, but for kicks I ran a few unrealistic micro
> benchmarks on my laptop. Extraction time for a cpio image with 1M+
> directories improved by 5ms (pre: 14.614s, post: 14.609s), when averaged
> across 20 runs of:
>   qemu-system-x86_64 -machine accel=kvm -smp cpus=1 -m 10240 \
>         -kernel ~/linux/arch/x86/boot/bzImage \
>         -initrd ./initrds/gen_cpio.out \
>         -append "initramfs_async=0 console=ttyS0 panic=0" -nographic \
>         | awk '/Trying to unpack rootfs/ {start_ts = $2};
>                /Freeing initrd memory/ {end_ts = $2}
>                END {printf "%f\n", end_ts - start_ts}'

What was the dispersion for those runs?
David Disseldorp Aug. 4, 2021, 1:37 p.m. UTC | #3
On Wed, 4 Aug 2021 12:57:16 +0000, Al Viro wrote:

> On Wed, Aug 04, 2021 at 11:31:29AM +0200, David Disseldorp wrote:
> > Ping, any feedback on this change?
> > 
> > I think it's a no brainer, but for kicks I ran a few unrealistic micro
> > benchmarks on my laptop. Extraction time for a cpio image with 1M+
> > directories improved by 5ms (pre: 14.614s, post: 14.609s), when averaged
> > across 20 runs of:
> >   qemu-system-x86_64 -machine accel=kvm -smp cpus=1 -m 10240 \
> >         -kernel ~/linux/arch/x86/boot/bzImage \
> >         -initrd ./initrds/gen_cpio.out \
> >         -append "initramfs_async=0 console=ttyS0 panic=0" -nographic \
> >         | awk '/Trying to unpack rootfs/ {start_ts = $2};
> >                /Freeing initrd memory/ {end_ts = $2}
> >                END {printf "%f\n", end_ts - start_ts}'  
> 
> What was the dispersion for those runs?

Too high for the 5ms to be considered statistically significant. Std
deviations were pre: 171ms, post: 214ms... <sigh> I'll redo this on a
proper test rig.

Cheers, David
diff mbox series

Patch

diff --git a/init/initramfs.c b/init/initramfs.c
index af27abc59643..f01590cefa2d 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -256,12 +256,11 @@  static int __init do_collect(void)
 
 static int __init do_header(void)
 {
-	if (memcmp(collected, "070707", 6)==0) {
-		error("incorrect cpio method used: use -H newc option");
-		return 1;
-	}
 	if (memcmp(collected, "070701", 6)) {
-		error("no cpio magic");
+		if (memcmp(collected, "070707", 6) == 0)
+			error("incorrect cpio method used: use -H newc option");
+		else
+			error("no cpio magic");
 		return 1;
 	}
 	parse_header(collected);