From: Ingo Molnar <mingo@kernel.org>
To: Andi Kleen <andi@firstfloor.org>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org, mmarek@suse.cz,
linux-kbuild@vger.kernel.org, JBeulich@suse.com,
akpm@linux-foundation.org,
Linus Torvalds <torvalds@linux-foundation.org>,
"H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: RFC: Link Time Optimization support for the kernel
Date: Tue, 21 Aug 2012 09:49:21 +0200 [thread overview]
Message-ID: <20120821074921.GA10809@gmail.com> (raw)
In-Reply-To: <20120820101044.GE16230@one.firstfloor.org>
* Andi Kleen <andi@firstfloor.org> wrote:
> On Mon, Aug 20, 2012 at 09:48:35AM +0200, Ingo Molnar wrote:
> >
> > * Andi Kleen <andi@firstfloor.org> wrote:
> >
> > > This rather large patchkit enables gcc Link Time Optimization (LTO)
> > > support for the kernel.
> > >
> > > With LTO gcc will do whole program optimizations for
> > > the whole kernel and each module. This increases compile time,
> > > but can generate faster code.
> >
> > By how much does it increase compile time?
>
> All numbers are preliminary at this point. I miss both some
> code quality and compile time improvements that it could do,
> to work around some issues that are fixable.
>
> Compile time:
>
> Compilation slowdown depends on the largest binary size. I
> see between 50% and 4x. The 4x case is mainly for allyes (so
> unlikely); a normal distro build, which is mostly modular, or
> a defconfig like build is more towards the 50%.
>
> Currently I have to disable slim LTO, which essentially means
> everything is compiled twice. Once that's fixed it should
> compile faster for the normal case too (although it will be
> still slower than non LTO)
The other hope would be that if LTO is used by a high-profile
project like the Linux kernel then the compiler folks might look
at it and improve it.
> A lot of the overhead on the larger builds is also some
> specific gcc code that I'm working with the gcc developers on
> to improve. So the 4x extreme case will hopefully go down.
>
> The large builds also currently suffer from too much memory
> consumption. That will hopefully improve too, as gcc improves.
Are there any LTO build files left around, blowing up the size
of the build tree?
> I wouldn't expect anyone using it for day to day kernel hacking
> (I understand that 50% are annoying for that). It's more like a
> "release build" mode.
>
> The performance is currently also missing some improvements
> due to workarounds.
>
> Performance:
>
> Hackbench goes about 5% faster, so the scheduler benefits.
> Kbuild is not changing much. Various network benchmarks over
> loopback go faster too (best case seen 18%+), so the network
> stack seems to benefit. A lot of micro benchmarks go faster,
> sometimes larger numbers. There are some minor regressions.
>
> A lot of benchmarking on larger workloads is still
> outstanding. But the existing numbers are promising I believe.
> Things will still change, it's still early.
>
> I would welcome any benchmarking from other people.
>
> I also expect gcc to do more LTO optimizations in the future,
> so we'll hopefully see more gains over time. Essentially it
> gives more power to the compiler.
>
> Long term it would also help the kernel source organization.
> For example there's no reason with LTO to have gigantic
> includes with large inlines, because cross file inlining works
> in a efficient way without reparsing.
Can the current implementation of LTO optimize to the level of
inlining? A lot of our include file hell situation results from
the desire to declare structures publicly so that inlined
functions can use them directly.
If data structures could be encapsulated/internalized to
subsystems and only global functions are exposed to other
subsystems [which are then LTO optimized] then our include
file dependencies could become a *lot* simpler.
Thanks,
Ingo
next prev parent reply other threads:[~2012-08-21 7:49 UTC|newest]
Thread overview: 128+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-19 2:55 RFC: Link Time Optimization support for the kernel Andi Kleen
2012-08-19 2:55 ` [PATCH 01/74] Add __visible Andi Kleen
2012-08-19 2:55 ` [PATCH 02/74] sections: Make all standard section identifiers __visible Andi Kleen
2012-08-19 2:55 ` [PATCH 03/74] sections: Make external kallsyms tables __visible Andi Kleen
2012-08-19 7:53 ` Jan Beulich
2012-08-19 15:29 ` Andi Kleen
2012-08-19 2:56 ` [PATCH 04/74] sections: Add __visible to ia64 sections Andi Kleen
2012-08-19 2:56 ` [PATCH 05/74] sections: Add __visible to m68k sections Andi Kleen
2012-08-19 2:56 ` [PATCH 06/74] sections: Add __visible to powerpc sections Andi Kleen
2012-08-19 2:56 ` [PATCH 07/74] sections: Add __visible to sh sections Andi Kleen
2012-08-19 2:56 ` [PATCH 08/74] sections: Add __visible to tile sections Andi Kleen
2012-08-19 2:56 ` [PATCH 09/74] sections: Add __visible to x86 sections Andi Kleen
2012-08-19 2:56 ` [PATCH 10/74] sections: Add __visible to drivers/{base,pci} sections Andi Kleen
2012-08-19 2:56 ` [PATCH 11/74] sections: Add __visible to rapidio sections Andi Kleen
2012-08-19 2:56 ` [PATCH 12/74] sections: Add __visible to jump_label sections Andi Kleen
2012-08-19 2:56 ` [PATCH 13/74] sections: Add __visible to init/* sections Andi Kleen
2012-08-19 2:56 ` [PATCH 14/74] sections: Add __visible to kernel/* sections Andi Kleen
2012-08-19 2:56 ` [PATCH 15/74] sections: Add __visible to kernel/trace/* sections Andi Kleen
2012-08-19 2:56 ` [PATCH 16/74] sections: Add __visible to lib/* sections Andi Kleen
2012-08-19 2:56 ` [PATCH 17/74] lto: Make asmlinkage __visible Andi Kleen
2012-08-19 2:56 ` [PATCH 18/74] lto, wan/sbni: Make inline assembler symbols visible and assembler global Andi Kleen
2012-08-19 2:56 ` [PATCH 19/74] x86, lto: Add missing asmlinkages and __visible Andi Kleen
2012-08-19 2:56 ` [PATCH 20/74] x86, lto: Change dotraplinkage into __visible on 32bit Andi Kleen
2012-09-01 14:44 ` Michal Marek
2012-08-19 2:56 ` [PATCH 21/74] lto: Make lockdep_sys_exit asmlinkage Andi Kleen
2012-08-19 2:56 ` [PATCH 22/74] lto: Change kernel_execve to asmlinkage for all architectures Andi Kleen
2012-08-19 2:56 ` [PATCH 23/74] lto, mutex: Mark __visible Andi Kleen
2012-08-19 2:56 ` [PATCH 24/74] lto: Mark do_exit asmlinkage Andi Kleen
2012-08-19 2:56 ` [PATCH 25/74] x86, lto: Fix sys_call_table type in asm/syscall.h v2 Andi Kleen
2012-08-19 2:56 ` [PATCH 26/74] lto, sound: Fix export symbols for !CONFIG_MODULES Andi Kleen
2012-08-20 8:30 ` Takashi Iwai
2012-08-20 9:45 ` Andi Kleen
2012-08-20 9:53 ` Takashi Iwai
2012-08-19 2:56 ` [PATCH 27/74] lto: Mark EXPORT_SYMBOL symbols __visible Andi Kleen
2012-08-20 6:54 ` Rusty Russell
2012-08-20 9:49 ` Andi Kleen
2012-08-19 2:56 ` [PATCH 28/74] lto: Make ksymtab and kcrctab symbols and __this_module __visible Andi Kleen
2012-08-19 2:56 ` [PATCH 29/74] x86, lto: Make amd.c vide visible Andi Kleen
2012-08-19 2:56 ` [PATCH 30/74] x86, lto: Fix AMD K6 indirect call check Andi Kleen
2012-08-19 2:56 ` [PATCH 31/74] x86, lto: Make various variables used by assembler code __visible Andi Kleen
2012-08-19 2:56 ` [PATCH 32/74] lto, PNP: Fix the inline assembler to use asmlinkage symbols Andi Kleen
2012-08-19 2:56 ` [PATCH 33/74] x86, lto, apm: Make APM data structure used from assembler visible Andi Kleen
2012-08-19 2:56 ` [PATCH 34/74] x86, lto, lguest: Fix C functions used by inline assembler Andi Kleen
2012-08-19 2:56 ` [PATCH 35/74] lto, crypto, aes: mark AES tables __visible Andi Kleen
2012-08-20 8:21 ` Herbert Xu
2012-08-19 2:56 ` [PATCH 36/74] lto, crypto, camelia: Make camelia tables used by assembler __visible Andi Kleen
2012-08-20 8:21 ` Herbert Xu
2012-08-19 2:56 ` [PATCH 37/74] lto, KVM: Don't assume asm statements end up in the same assembler file Andi Kleen
2012-08-19 8:59 ` Avi Kivity
2012-08-19 15:09 ` Andi Kleen
2012-08-19 15:12 ` Avi Kivity
2012-08-19 15:20 ` Andi Kleen
2012-08-19 2:56 ` [PATCH 38/74] lto, watchdog/hpwdt.c: Make assembler label global Andi Kleen
2012-08-22 19:25 ` Wim Van Sebroeck
2012-08-22 20:11 ` Mingarelli, Thomas
2012-08-19 2:56 ` [PATCH 39/74] x86, lto: Mark vdso variables __visible Andi Kleen
2012-08-19 2:56 ` [PATCH 40/74] lto, powerpc: Disable LTO for the powerpc VDSO Andi Kleen
2012-08-19 2:56 ` [PATCH 41/74] x86, lto: Disable LTO for the x86 VDSO Andi Kleen
2012-08-19 2:56 ` [PATCH 42/74] lto, raid: disable LTO for the Altivec RAID code Andi Kleen
2012-08-19 2:56 ` [PATCH 43/74] lto, workaround: Disable LTO for sys_ni to work around alias bugs Andi Kleen
2012-08-19 2:56 ` [PATCH 44/74] lto: Mark functions used by the vsyscall init code visible Andi Kleen
2012-09-01 15:26 ` Michal Marek
2012-09-01 17:16 ` Andi Kleen
2012-09-01 17:26 ` Andi Kleen
2012-08-19 2:56 ` [PATCH 45/74] lto: Mark rwsem functions that can be called from assembler asmlinkage Andi Kleen
2012-08-19 2:56 ` [PATCH 46/74] x86, lto: Disable fancy hweight optimizations for LTO Andi Kleen
2012-08-19 8:28 ` Jan Beulich
2012-08-19 15:15 ` Andi Kleen
2012-08-20 10:57 ` Jan Beulich
2012-08-20 11:18 ` Andi Kleen
2012-08-20 12:38 ` Jan Beulich
2012-08-20 9:15 ` Avi Kivity
2012-08-20 9:42 ` Andi Kleen
2012-08-19 2:56 ` [PATCH 47/74] x86, lto: Fix kprobes " Andi Kleen
2012-08-19 2:56 ` [PATCH 48/74] x86, lto: Use inline assembler instead of global register variable to get sp Andi Kleen
2012-08-19 8:37 ` Jan Beulich
2012-08-19 15:18 ` Andi Kleen
2012-08-19 2:56 ` [PATCH 49/74] x86, lto, paravirt: Add __visible/asmlinkage to xen paravirt ops Andi Kleen
2012-08-19 2:56 ` [PATCH 50/74] x86, lto: Make empty_zero_page __visible for LTO Andi Kleen
2012-08-19 2:56 ` [PATCH 51/74] x86, lto, efi: Mark the efi variable used from assembler __visible Andi Kleen
2012-08-19 2:56 ` [PATCH 52/74] x86, lto, paravirt: Don't rely on local assembler labels Andi Kleen
2012-08-19 8:26 ` Jeremy Fitzhardinge
2012-08-19 2:56 ` [PATCH 53/74] x86, lto, paravirt: Make paravirt thunks global Andi Kleen
2012-08-19 8:27 ` Jeremy Fitzhardinge
2012-08-19 15:25 ` Andi Kleen
2012-08-19 2:56 ` [PATCH 54/74] x86, lto, vdso: Don't duplicate vvar address variables Andi Kleen
2012-08-20 17:47 ` Andrew Lutomirski
2012-08-19 2:56 ` [PATCH 55/74] lto, workaround: Add workaround for initcall reordering Andi Kleen
2012-08-19 8:46 ` Jan Beulich
2012-08-19 15:01 ` Andi Kleen
2012-08-20 11:00 ` Jan Beulich
2012-08-19 2:56 ` [PATCH 56/74] lto, workaround: Add workaround for missing LTO symbols in igb Andi Kleen
2012-08-22 8:43 ` Arnd Bergmann
2012-08-22 12:36 ` Andi Kleen
2012-08-19 2:56 ` [PATCH 57/74] lto, workaround: Add workaround for LTO build problem in pvrusb2-audio Andi Kleen
2012-08-19 2:56 ` [PATCH 58/74] lto, workaround: Work around LTO compiler problem in atheros driver Andi Kleen
2012-08-19 2:56 ` [PATCH 59/74] lto: Handle LTO common symbols in module loader Andi Kleen
2012-08-19 8:53 ` Jan Beulich
2012-08-19 15:23 ` Andi Kleen
2012-08-19 2:56 ` [PATCH 60/74] lto, Kbuild, bloat-o-meter: fix static detection Andi Kleen
2012-08-19 2:56 ` [PATCH 61/74] Kbuild, lto: Drop .number postfixes in modpost Andi Kleen
2012-08-19 2:56 ` [PATCH 62/74] Kbuild, lto: add ld-version and ld-ifversion macros Andi Kleen
2012-08-19 2:56 ` [PATCH 63/74] Kbuild, lto: Print correct info messages for vmlinux link Andi Kleen
2012-08-19 2:57 ` [PATCH 64/74] Kbuild, lto: Add a gcc-ld script to let run gcc as ld Andi Kleen
2012-08-19 2:57 ` [PATCH 65/74] Kbuild, lto: Disable LTO for asm-offsets.c Andi Kleen
2012-08-19 2:57 ` [PATCH 66/74] Kbuild, lto: Handle basic LTO in modpost Andi Kleen
2012-08-19 2:57 ` [PATCH 67/74] Kbuild, lto: Add Link Time Optimization support Andi Kleen
2012-08-19 2:57 ` [PATCH 68/74] Kbuild, lto: Add LTO build Documentation Andi Kleen
2012-08-19 2:57 ` [PATCH 69/74] lto: Increase kallsyms max symbol length Andi Kleen
2012-08-19 2:57 ` [PATCH 70/74] Kbuild, lto: Handle longer symbols in kallsyms.c Andi Kleen
2012-08-19 2:57 ` [PATCH 71/74] lto, kprobes: Use KSYM_NAME_LEN to size identifier buffers Andi Kleen
2012-08-21 4:44 ` Ananth N Mavinakayanahalli
2012-08-19 2:57 ` [PATCH 72/74] lto: Mark spinlocks noinline when inline spinlocks are disabled Andi Kleen
2012-08-19 2:57 ` [PATCH 73/74] lto, module: Warn about modules that are not fully LTOed Andi Kleen
2012-08-19 2:57 ` [PATCH 74/74] lto, workaround: Mark do_futex noinline to prevent clobbering ebp Andi Kleen
2012-08-23 0:17 ` H. Peter Anvin
2012-08-23 2:14 ` H. Peter Anvin
2012-08-23 2:29 ` Andi Kleen
2012-08-23 3:14 ` H. Peter Anvin
2012-08-20 7:48 ` RFC: Link Time Optimization support for the kernel Ingo Molnar
2012-08-20 10:10 ` Andi Kleen
2012-08-21 7:49 ` Ingo Molnar [this message]
2012-08-21 14:05 ` Don Zickus
2012-08-21 14:26 ` Avi Kivity
2012-08-21 17:02 ` Andi Kleen
2012-08-23 15:02 ` Jan Hubicka
2012-08-22 8:58 ` Arnd Bergmann
2012-08-22 12:35 ` Andi Kleen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120821074921.GA10809@gmail.com \
--to=mingo@kernel.org \
--cc=JBeulich@suse.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=hpa@zytor.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mmarek@suse.cz \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).