On Thursday, August 4, 2016 10:10:51 AM CEST Stephen Rothwell wrote: > Hi Arnd, > > On Wed, 03 Aug 2016 20:52:48 +0200 Arnd Bergmann <arnd@xxxxxxxx> wrote: > > > > Most of the difference appears to be in branch trampolines (634 added, > > 559 removed, 14837 unchanged) as you suspect, but I also see a couple > > of symbols show up in vmlinux that were not there before: > > > > -A __crc_dma_noop_ops > > -D dma_noop_ops > > -R __clz_tab > > -r fdt_errtable > > -r __kcrctab_dma_noop_ops > > -r __kstrtab_dma_noop_ops > > -R __ksymtab_dma_noop_ops > > -t dma_noop_alloc > > -t dma_noop_free > > -t dma_noop_map_page > > -t dma_noop_mapping_error > > -t dma_noop_map_sg > > -t dma_noop_supported > > -T fdt_add_reservemap_entry > > -T fdt_begin_node > > -T fdt_create > > -T fdt_create_empty_tree > > -T fdt_end_node > > -T fdt_finish > > -T fdt_finish_reservemap > > -T fdt_property > > -T fdt_resize > > -T fdt_strerror > > -T find_cpio_data > > > > From my first look, it seems that all of lib/*.o is now getting linked > > into vmlinux, while we traditionally leave out everything from lib/ > > that is not referenced. > > You could try removing the --{,no-}whole-archive arguments to ld in > scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh. Last time I did > that, though, a whole lot of stuff failed to be linked in. (Especially > stuff only referenced by EXPORT_SYMBOL()s, bu that may have been fixed). I tried this diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index b5e40ed86e60..89bca1a25916 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -44,7 +44,7 @@ modpost_link() local objects if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then - objects="--whole-archive ${KBUILD_VMLINUX_INIT} ${KBUILD_VMLINUX_MAIN} --no-whole-archive" + objects="${KBUILD_VMLINUX_INIT} ${KBUILD_VMLINUX_MAIN}" else objects="${KBUILD_VMLINUX_INIT} --start-group ${KBUILD_VMLINUX_MAIN} --end-group" fi but that did not seem to change anything, the extra symbols are still there. I have not tried to understand what that actually does, so maybe I misunderstood your suggestion. > > I also see a noticeable overhead in link time, the numbers are for > > a cache-hot rebuild after a successful allyesconfig build, using a > > 24-way Opteron@2.5Ghz, just relinking vmlinux: > > I was afraid of that, but it is offset by the time saved by not doing > the "ld -r"s along the way? It may also be that (for powerpc anyway) > the linker is doing a better job. At least on a big SMP system, it doesn't seem to make much difference, as the "ld -r" steps are easily parallized $ find build/ -name built-in.o | xargs rm ; time make -skj30 vmlinux real 2m12.092s user 3m52.932s sys 0m51.248s $ time make -skj30 vmlinux real 2m12.162s user 3m44.788s sys 0m47.788s I tried this twice with identical results: "user" time increases by eight seconds today when we have to rebuild all "built-in.o" files rather than just relinking vmlinux, but elapsed time is unchanged. After your patch that difference becomes smaller (three seconds in one run, could be within the noise), but we still have the extra two minutes for the total build time: $ find build/ -name built-in.o | xargs rm ; time make -skj30 vmlinux real 4m20.717s user 5m47.556s sys 0m54.128s $ time make -skj30 vmlinux real 4m18.835s user 5m44.552s sys 0m53.152s FWIW, here is a sample build output I get on an allyesconfig build, with timestamps added: $ time make W= -kj30 vmlinux make[1]: Entering directory '/git/arm-soc' make[2]: Entering directory '/git/arm-soc/build/tmp' 10:46:12 CHK include/config/kernel.release 10:46:13 GEN ./Makefile 10:46:13 CHK include/generated/uapi/linux/version.h Using /git/arm-soc as source for kernel 10:46:13 CHK include/generated/utsrelease.h 10:46:13 CHK include/generated/timeconst.h 10:46:13 CHK include/generated/bounds.h 10:46:13 CHK include/generated/asm-offsets.h 10:46:13 CALL /git/arm-soc/scripts/checksyscalls.sh 10:46:14 CHK include/generated/compile.h 10:46:18 CHK kernel/config_data.h 10:46:20 CC drivers/misc/lkdtm_rodata.o 10:46:20 OBJCOPY drivers/misc/lkdtm_rodata_objcopy.o 10:46:20 LD drivers/misc/lkdtm.o 10:46:20 LD drivers/misc/built-in.o 10:46:20 DTC drivers/gpu/drm/tilcdc/tilcdc_slave_compat.dtb 10:46:20 DTB drivers/gpu/drm/tilcdc/tilcdc_slave_compat.dtb.S 10:46:20 AS drivers/gpu/drm/tilcdc/tilcdc_slave_compat.dtb.o 10:46:20 LD drivers/gpu/drm/tilcdc/built-in.o rm drivers/gpu/drm/tilcdc/tilcdc_slave_compat.dtb.S drivers/gpu/drm/tilcdc/tilcdc_slave_compat.dtb 10:46:33 LD drivers/gpu/drm/built-in.o 10:46:33 LD drivers/gpu/built-in.o 10:46:36 CHK include/generated/uapi/linux/version.h 10:46:36 LINK vmlinux 10:46:37 LD vmlinux.o 10:47:14 MODPOST vmlinux.o 10:47:16 GEN .version 10:47:17 CHK include/generated/compile.h 10:47:17 UPD include/generated/compile.h 10:47:17 CC init/version.o 10:47:17 LD init/built-in.o 10:48:09 KSYM .tmp_kallsyms1.o 10:49:19 KSYM .tmp_kallsyms2.o 10:49:33 LD vmlinux 10:50:27 SORTEX vmlinux 10:50:27 SYSMAP System.map make[2]: Leaving directory '/git/arm-soc/build/tmp' make[1]: Leaving directory '/git/arm-soc' real 4m18.033s user 5m44.728s sys 0m52.724s (yes, I also just realized we should fix the tilcdc and lkdtm drivers to not force a rebuild). Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-next" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html