Re: [PATCH] arm64: enable dead code elimination

From: Will Deacon
Date: Mon Jul 17 2023 - 05:24:55 EST


On Mon, Jul 17, 2023 at 04:07:39PM +0800, Kefeng Wang wrote:
> Select CONFIG_HAVE_LD_DEAD_CODE_DATA_ELIMINATION for arm64, allowing the
> user to enable dead code elimination. In order for this to work, ensure
> that we keep the necessary tables by annotating them with KEEP, also it
> requires further changes to linker script to KEEP some tables and wildcard
> compiler generated sections into the right place.
>
> The following comparison is based 6.5-rc2 with defconfig,
>
> $ ./scripts/bloat-o-meter vmlinux-base vmlinux-new
> add/remove: 3/1106 grow/shrink: 4102/6964 up/down: 35704/-99980 (-64276)
> Function old new delta
> ...
> Total: Before=17888959, After=17824683, chg -0.36%
>
> add/remove: 0/1 grow/shrink: 0/1 up/down: 0/-44 (-44)
> Data old new delta
> ...
> Total: Before=4820808, After=4820764, chg -0.00%
>
> add/remove: 0/1 grow/shrink: 0/1 up/down: 0/-1096 (-1096)
> RO Data old new delta
> ...
> Total: Before=5179123, After=5178027, chg -0.02%
>
> $ size vmlinux-base vmlinux
> text data bss dec hex filename
> 25433734 15385766 630656 41450156 2787aac vmlinux-base
> 24756738 15360870 629888 40747496 26dc1e8 vmlinux-new
>
> Memory available after booting, saving 704k on qemu,
> base: 8084532K/8388608K
> new: 8085236K/8388608K

Is that a 0.009% improvement? Is it really worth the hassle?

x86 doesn't select this and risc-v had to turn it off for LLD, so it feels
like we're just creating a rod for our own back by selecting it.

Will

> Signed-off-by: Kefeng Wang <wangkefeng.wang@xxxxxxxxxx>
> ---
> arch/arm64/Kconfig | 1 +
> arch/arm64/kernel/vmlinux.lds.S | 5 +++--
> 2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index a2511b30d0f6..73bb908ec62f 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -148,6 +148,7 @@ config ARM64
> select GENERIC_VDSO_TIME_NS
> select HARDIRQS_SW_RESEND
> select HAS_IOPORT
> + select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
> select HAVE_MOVE_PMD
> select HAVE_MOVE_PUD
> select HAVE_PCI
> diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
> index 3cd7e76cc562..bb4ce6cd6896 100644
> --- a/arch/arm64/kernel/vmlinux.lds.S
> +++ b/arch/arm64/kernel/vmlinux.lds.S
> @@ -238,7 +238,7 @@ SECTIONS
> . = ALIGN(4);
> .altinstructions : {
> __alt_instructions = .;
> - *(.altinstructions)
> + KEEP(*(.altinstructions))
> __alt_instructions_end = .;
> }
>
> @@ -258,8 +258,9 @@ SECTIONS
> INIT_CALLS
> CON_INITCALL
> INIT_RAM_FS
> - *(.init.altinstructions .init.bss) /* from the EFI stub */
> + KEEP(*(.init.altinstructions .init.bss*)) /* from the EFI stub */
> }
> +
> .exit.data : {
> EXIT_DATA
> }
> --
> 2.27.0
>