aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-03-03 06:38:52 -0500
committerIngo Molnar <mingo@elte.hu>2008-04-26 11:44:55 -0400
commit60a3cdd0639473c79c253bc08c8ef8f882cca107 (patch)
treee72a5ca87873b286b02966a390277f828139d350
parentb1721d0da266b4af8cb4419473b4ca36206ab200 (diff)
x86: add optimized inlining
add CONFIG_OPTIMIZE_INLINING=y. allow gcc to optimize the kernel image's size by uninlining functions that have been marked 'inline'. Previously gcc was forced by Linux to always-inline these functions via a gcc attribute: #define inline inline __attribute__((always_inline)) Especially when the user has already selected CONFIG_OPTIMIZE_FOR_SIZE=y this can make a huge difference in kernel image size (using a standard Fedora .config): text data bss dec hex filename 5613924 562708 3854336 10030968 990f78 vmlinux.before 5486689 562708 3854336 9903733 971e75 vmlinux.after that's a 2.3% text size reduction (!). Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/Kconfig.debug13
-rw-r--r--arch/x86/configs/i386_defconfig1
-rw-r--r--arch/x86/configs/x86_64_defconfig1
-rw-r--r--include/linux/compiler-gcc.h12
4 files changed, 24 insertions, 3 deletions
diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
index 239fd9fba0a5..5b1979a45a1e 100644
--- a/arch/x86/Kconfig.debug
+++ b/arch/x86/Kconfig.debug
@@ -257,3 +257,16 @@ config CPA_DEBUG
257 Do change_page_attr() self-tests every 30 seconds. 257 Do change_page_attr() self-tests every 30 seconds.
258 258
259endmenu 259endmenu
260
261config OPTIMIZE_INLINING
262 bool "Allow gcc to uninline functions marked 'inline'"
263 default y
264 help
265 This option determines if the kernel forces gcc to inline the functions
266 developers have marked 'inline'. Doing so takes away freedom from gcc to
267 do what it thinks is best, which is desirable for the gcc 3.x series of
268 compilers. The gcc 4.x series have a rewritten inlining algorithm and
269 disabling this option will generate a smaller kernel there. Hopefully
270 this algorithm is so good that allowing gcc4 to make the decision can
271 become the default in the future, until then this option is there to
272 test gcc for this.
diff --git a/arch/x86/configs/i386_defconfig b/arch/x86/configs/i386_defconfig
index 3df340b54e57..ad7ddaaff588 100644
--- a/arch/x86/configs/i386_defconfig
+++ b/arch/x86/configs/i386_defconfig
@@ -1421,6 +1421,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
1421# CONFIG_DEBUG_VM is not set 1421# CONFIG_DEBUG_VM is not set
1422# CONFIG_DEBUG_LIST is not set 1422# CONFIG_DEBUG_LIST is not set
1423# CONFIG_FRAME_POINTER is not set 1423# CONFIG_FRAME_POINTER is not set
1424CONFIG_OPTIMIZE_INLINING=y
1424# CONFIG_RCU_TORTURE_TEST is not set 1425# CONFIG_RCU_TORTURE_TEST is not set
1425# CONFIG_LKDTM is not set 1426# CONFIG_LKDTM is not set
1426# CONFIG_FAULT_INJECTION is not set 1427# CONFIG_FAULT_INJECTION is not set
diff --git a/arch/x86/configs/x86_64_defconfig b/arch/x86/configs/x86_64_defconfig
index eef98cb00c62..2d6f5b2809d2 100644
--- a/arch/x86/configs/x86_64_defconfig
+++ b/arch/x86/configs/x86_64_defconfig
@@ -1346,6 +1346,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
1346# CONFIG_DEBUG_VM is not set 1346# CONFIG_DEBUG_VM is not set
1347# CONFIG_DEBUG_LIST is not set 1347# CONFIG_DEBUG_LIST is not set
1348# CONFIG_FRAME_POINTER is not set 1348# CONFIG_FRAME_POINTER is not set
1349CONFIG_OPTIMIZE_INLINING=y
1349# CONFIG_RCU_TORTURE_TEST is not set 1350# CONFIG_RCU_TORTURE_TEST is not set
1350# CONFIG_LKDTM is not set 1351# CONFIG_LKDTM is not set
1351# CONFIG_FAULT_INJECTION is not set 1352# CONFIG_FAULT_INJECTION is not set
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index fe23792f05c1..340bc5d92772 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -28,9 +28,15 @@
28#define __must_be_array(a) \ 28#define __must_be_array(a) \
29 BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0]))) 29 BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
30 30
31#define inline inline __attribute__((always_inline)) 31/*
32#define __inline__ __inline__ __attribute__((always_inline)) 32 * Force always-inline if the user requests it so via the .config:
33#define __inline __inline __attribute__((always_inline)) 33 */
34#if !defined(CONFIG_OPTIMIZE_INLINING) && (__GNUC__ >= 4)
35# define inline inline __attribute__((always_inline))
36# define __inline__ __inline__ __attribute__((always_inline))
37# define __inline __inline __attribute__((always_inline))
38#endif
39
34#define __deprecated __attribute__((deprecated)) 40#define __deprecated __attribute__((deprecated))
35#define __packed __attribute__((packed)) 41#define __packed __attribute__((packed))
36#define __weak __attribute__((weak)) 42#define __weak __attribute__((weak))