[OE-core] [PATCH] kernel: Use hardlinks during do_install for speed

Hart, Darren darren.hart at intel.com
Fri Nov 8 16:48:01 UTC 2013


On Fri, 2013-11-08 at 15:17 +0000, Richard Purdie wrote:
> Whilst the comment says we can't do this, its incorrect, install operates
> on WORKDIR and its hard for different parts of WORKDIR to be on different

Is it hard? Or is it not possible / not supported?

My understanding was it was possible and therefor we couldn't hardlink.
I'm thrilled at the prospect of being wrong there though!

> filesystems. Hardlinking instead of copying is therefore a nice performance
> gain.
> 
> Also, completely skip the Documentation directory (adding a dummy Makefile
> to keep make happy) and tweak the other cp commands to link since if we
> don't we'd get "this is the same file" type errors from cp for some kernel
> versions.
> 
> For do_install on linux-yocto, this takes it from 227s -> 84s.

This, and the others, are fantastic improvements, thanks RP!

--
Darren

> 
> Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
> ---
> diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
> index a4db9f5..0b6360f 100644
> --- a/meta/classes/kernel.bbclass
> +++ b/meta/classes/kernel.bbclass
> @@ -236,20 +236,21 @@ kernel_do_install() {
>  	# dir. This ensures the original Makefiles are used and not the
>  	# redirecting Makefiles in the build directory.
>  	#
> -	# work and sysroots can be on different partitions, so we can't rely on
> -	# hardlinking, unfortunately.
> -	#
> -	find . -depth -not -name "*.cmd" -not -name "*.o" -not -path "./.*" -print0 | cpio --null -pdu $kerneldir
> +	find . -depth -not -name "*.cmd" -not -name "*.o" -not -path "./Documentation*" -not -path "./.*" -print0 | cpio --null -pdlu $kerneldir
>  	cp .config $kerneldir
>  	if [ "${S}" != "${B}" ]; then
>  		pwd="$PWD"
>  		cd "${S}"
> -		find . -depth -not -path "./.*" -print0 | cpio --null -pdu $kerneldir
> +		find . -depth -not -path "./Documentation*" -not -path "./.*" -print0 | cpio --null -pdlu $kerneldir
>  		cd "$pwd"
>  	fi
>  	install -m 0644 ${KERNEL_OUTPUT} $kerneldir/${KERNEL_IMAGETYPE}
>  	install -m 0644 System.map $kerneldir/System.map-${KERNEL_VERSION}
>  
> +	# Dummy Makefile so the clean below works
> +        mkdir $kerneldir/Documentation
> +        touch $kerneldir/Documentation/Makefile
> +
>  	#
>  	# Clean and remove files not needed for building modules.
>  	# Some distributions go through a lot more trouble to strip out
> @@ -262,22 +263,21 @@ kernel_do_install() {
>  	oe_runmake -C $kerneldir CC="${KERNEL_CC}" LD="${KERNEL_LD}" clean
>  	make -C $kerneldir _mrproper_scripts
>  	find $kerneldir -path $kerneldir/lib -prune -o -path $kerneldir/tools -prune -o -path $kerneldir/scripts -prune -o -name "*.[csS]" -exec rm '{}' \;
> -	find $kerneldir/Documentation -name "*.txt" -exec rm '{}' \;
>  
>  	# As of Linux kernel version 3.0.1, the clean target removes
>  	# arch/powerpc/lib/crtsavres.o which is present in
>  	# KBUILD_LDFLAGS_MODULE, making it required to build external modules.
>  	if [ ${ARCH} = "powerpc" ]; then
> -		cp arch/powerpc/lib/crtsavres.o $kerneldir/arch/powerpc/lib/crtsavres.o
> +		cp -nl arch/powerpc/lib/crtsavres.o $kerneldir/arch/powerpc/lib/crtsavres.o
>  	fi
>  
>  	# Necessary for building modules like compat-wireless.
>  	if [ -f include/generated/bounds.h ]; then
> -		cp include/generated/bounds.h $kerneldir/include/generated/bounds.h
> +		cp -nl include/generated/bounds.h $kerneldir/include/generated/bounds.h
>  	fi
>  	if [ -d arch/${ARCH}/include/generated ]; then
>  		mkdir -p $kerneldir/arch/${ARCH}/include/generated/
> -		cp -fR arch/${ARCH}/include/generated/* $kerneldir/arch/${ARCH}/include/generated/
> +		cp -fnlR arch/${ARCH}/include/generated/* $kerneldir/arch/${ARCH}/include/generated/
>  	fi
>  
>  	# Remove the following binaries which cause strip or arch QA errors
> 
> 

-- 
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel



More information about the Openembedded-core mailing list