linux-kbuild.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jan Hubicka <hubicka@ucw.cz>
To: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>,
	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>,
	hubicka@ucw.cz
Subject: Re: RFC: Link Time Optimization support for the kernel
Date: Thu, 23 Aug 2012 17:02:17 +0200	[thread overview]
Message-ID: <20120823150217.GA29373@kam.mff.cuni.cz> (raw)
In-Reply-To: <20120821170216.GM16230@one.firstfloor.org>

> > 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.
> 
> Yes, long term we could have these benefits.

Yes, LTO should make in long term life of developers easier, it is just not tool
how to get few extra % of performance.
There is a lot to do.
> 
> BTW I should add LTO does more than just inlining:
> - Drop unused global functions and variables
>   (so may cut down on ifdefs)
> - Detect type inconsistencies between files
> - Partial inlining (inline only parts of a function like a test
>   at the beginning)
> - Detect pure and const functions without side effects that can be more 
>   aggressively optimized in the caller.
Also noreturn and nothorw are autodetected (the second is probably not big deal
for kernel, but it makes some C++ codebases a lot smaller by elliminating EH
and cleanps). We plan to add more in near future.
> - Detect global clobbers globally. Normally any global call has to 
>   assume all global variables could be changed.  With LTO information some
>   of them can be cached in registers over calls.
> - Detect read only variables and optimize them
> - Optimize arguments to global functions (drop unnecessary arguments, 
>   optimize input/output etc.)

At this moment this really happen s within compilation units only.
It is one of harder optimizations to get working over whole program,
we are slowly getting infrasrtucture to make this possible.

> - Replace indirect calls with direct calls, enabling other
>   optimizations.
> - Do constant propagation and specialization for functions. So if a
>   function is called commonly with a constant it can generate a special 
>   variant of this function optimized for that.  This still needs more tuning (and
>   currently the code size impact is on the largish side), but I hope
>   to eventually have e.g. a special kmalloc optimized for GFP_KERNEL. 
>   It can also in principle inline callbacks.

Also profile propagation is done.  When function is called only on cold paths, it becomes
cold.

Thanks for all the hard work on LTO kernel, Andi!
Honza
> 
> -Andi
> -- 
> ak@linux.intel.com -- Speaking for myself only.

  reply	other threads:[~2012-08-23 15:13 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
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 [this message]
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=20120823150217.GA29373@kam.mff.cuni.cz \
    --to=hubicka@ucw.cz \
    --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=mingo@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).