kernel: support gcc-optimized inlining on all architectures
authorFelix Fietkau <nbd@nbd.name>
Thu, 25 Jan 2018 13:01:34 +0000 (14:01 +0100)
committerFelix Fietkau <nbd@nbd.name>
Tue, 9 Oct 2018 12:15:53 +0000 (14:15 +0200)
Optimized inlining was disabled by default when gcc 4 was still
relatively new. By now, all gcc versions handle this well and there
seems to be no real reason to keep it x86-only.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
target/linux/generic/config-4.14
target/linux/generic/config-4.9
target/linux/generic/pending-4.14/220-optimize_inlining.patch [new file with mode: 0644]
target/linux/generic/pending-4.9/220-optimize_inlining.patch [new file with mode: 0644]
target/linux/x86/config-4.14

index 17655f4..c9705d1 100644 (file)
@@ -3320,6 +3320,7 @@ CONFIG_NMI_LOG_BUF_SHIFT=13
 # CONFIG_OPROFILE is not set
 # CONFIG_OPROFILE_EVENT_MULTIPLEX is not set
 # CONFIG_OPT3001 is not set
+# CONFIG_OPTIMIZE_INLINING is not set
 # CONFIG_ORANGEFS_FS is not set
 # CONFIG_ORION_WATCHDOG is not set
 # CONFIG_OSF_PARTITION is not set
index 85ae3fe..5153ef6 100644 (file)
@@ -3119,6 +3119,7 @@ CONFIG_NMI_LOG_BUF_SHIFT=13
 # CONFIG_OPROFILE is not set
 # CONFIG_OPROFILE_EVENT_MULTIPLEX is not set
 # CONFIG_OPT3001 is not set
+# CONFIG_OPTIMIZE_INLINING is not set
 # CONFIG_ORANGEFS_FS is not set
 # CONFIG_ORION_WATCHDOG is not set
 # CONFIG_OSF_PARTITION is not set
diff --git a/target/linux/generic/pending-4.14/220-optimize_inlining.patch b/target/linux/generic/pending-4.14/220-optimize_inlining.patch
new file mode 100644 (file)
index 0000000..1929d02
--- /dev/null
@@ -0,0 +1,70 @@
+--- a/arch/x86/Kconfig.debug
++++ b/arch/x86/Kconfig.debug
+@@ -284,20 +284,6 @@ config CPA_DEBUG
+       ---help---
+         Do change_page_attr() self-tests every 30 seconds.
+-config OPTIMIZE_INLINING
+-      bool "Allow gcc to uninline functions marked 'inline'"
+-      ---help---
+-        This option determines if the kernel forces gcc to inline the functions
+-        developers have marked 'inline'. Doing so takes away freedom from gcc to
+-        do what it thinks is best, which is desirable for the gcc 3.x series of
+-        compilers. The gcc 4.x series have a rewritten inlining algorithm and
+-        enabling this option will generate a smaller kernel there. Hopefully
+-        this algorithm is so good that allowing gcc 4.x and above to make the
+-        decision will become the default in the future. Until then this option
+-        is there to test gcc for this.
+-
+-        If unsure, say N.
+-
+ config DEBUG_ENTRY
+       bool "Debug low-level entry code"
+       depends on DEBUG_KERNEL
+--- a/lib/Kconfig.debug
++++ b/lib/Kconfig.debug
+@@ -137,6 +137,20 @@ endmenu # "printk and dmesg options"
+ menu "Compile-time checks and compiler options"
++config OPTIMIZE_INLINING
++      bool "Allow gcc to uninline functions marked 'inline'"
++      ---help---
++        This option determines if the kernel forces gcc to inline the functions
++        developers have marked 'inline'. Doing so takes away freedom from gcc to
++        do what it thinks is best, which is desirable for the gcc 3.x series of
++        compilers. The gcc 4.x series have a rewritten inlining algorithm and
++        enabling this option will generate a smaller kernel there. Hopefully
++        this algorithm is so good that allowing gcc 4.x and above to make the
++        decision will become the default in the future. Until then this option
++        is there to test gcc for this.
++
++        If unsure, say N.
++
+ config DEBUG_INFO
+       bool "Compile the kernel with debug info"
+       depends on DEBUG_KERNEL && !COMPILE_TEST
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -295,9 +295,6 @@ config ZONE_DMA32
+ config AUDIT_ARCH
+       def_bool y if X86_64
+-config ARCH_SUPPORTS_OPTIMIZED_INLINING
+-      def_bool y
+-
+ config ARCH_SUPPORTS_DEBUG_PAGEALLOC
+       def_bool y
+--- a/include/linux/compiler-gcc.h
++++ b/include/linux/compiler-gcc.h
+@@ -90,8 +90,7 @@
+  * of extern inline functions at link time.
+  * A lot of inline functions can cause havoc with function tracing.
+  */
+-#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) ||              \
+-    !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
++#if !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
+ #define inline \
+       inline __attribute__((always_inline, unused)) notrace __gnu_inline
+ #else
diff --git a/target/linux/generic/pending-4.9/220-optimize_inlining.patch b/target/linux/generic/pending-4.9/220-optimize_inlining.patch
new file mode 100644 (file)
index 0000000..75c04ea
--- /dev/null
@@ -0,0 +1,70 @@
+--- a/arch/x86/Kconfig.debug
++++ b/arch/x86/Kconfig.debug
+@@ -287,20 +287,6 @@ config CPA_DEBUG
+       ---help---
+         Do change_page_attr() self-tests every 30 seconds.
+-config OPTIMIZE_INLINING
+-      bool "Allow gcc to uninline functions marked 'inline'"
+-      ---help---
+-        This option determines if the kernel forces gcc to inline the functions
+-        developers have marked 'inline'. Doing so takes away freedom from gcc to
+-        do what it thinks is best, which is desirable for the gcc 3.x series of
+-        compilers. The gcc 4.x series have a rewritten inlining algorithm and
+-        enabling this option will generate a smaller kernel there. Hopefully
+-        this algorithm is so good that allowing gcc 4.x and above to make the
+-        decision will become the default in the future. Until then this option
+-        is there to test gcc for this.
+-
+-        If unsure, say N.
+-
+ config DEBUG_ENTRY
+       bool "Debug low-level entry code"
+       depends on DEBUG_KERNEL
+--- a/lib/Kconfig.debug
++++ b/lib/Kconfig.debug
+@@ -117,6 +117,20 @@ endmenu # "printk and dmesg options"
+ menu "Compile-time checks and compiler options"
++config OPTIMIZE_INLINING
++      bool "Allow gcc to uninline functions marked 'inline'"
++      ---help---
++        This option determines if the kernel forces gcc to inline the functions
++        developers have marked 'inline'. Doing so takes away freedom from gcc to
++        do what it thinks is best, which is desirable for the gcc 3.x series of
++        compilers. The gcc 4.x series have a rewritten inlining algorithm and
++        enabling this option will generate a smaller kernel there. Hopefully
++        this algorithm is so good that allowing gcc 4.x and above to make the
++        decision will become the default in the future. Until then this option
++        is there to test gcc for this.
++
++        If unsure, say N.
++
+ config DEBUG_INFO
+       bool "Compile the kernel with debug info"
+       depends on DEBUG_KERNEL && !COMPILE_TEST
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -273,9 +273,6 @@ config ZONE_DMA32
+ config AUDIT_ARCH
+       def_bool y if X86_64
+-config ARCH_SUPPORTS_OPTIMIZED_INLINING
+-      def_bool y
+-
+ config ARCH_SUPPORTS_DEBUG_PAGEALLOC
+       def_bool y
+--- a/include/linux/compiler-gcc.h
++++ b/include/linux/compiler-gcc.h
+@@ -89,8 +89,7 @@
+  * of extern inline functions at link time.
+  * A lot of inline functions can cause havoc with function tracing.
+  */
+-#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) ||              \
+-    !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
++#if !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
+ #define inline \
+       inline __attribute__((always_inline, unused)) notrace __gnu_inline
+ #else
index 038d874..4a81cbc 100644 (file)
@@ -350,7 +350,6 @@ CONFIG_NVRAM=y
 CONFIG_OLD_SIGACTION=y
 CONFIG_OLD_SIGSUSPEND3=y
 CONFIG_OPROFILE_NMI_TIMER=y
-# CONFIG_OPTIMIZE_INLINING is not set
 CONFIG_OUTPUT_FORMAT="elf32-i386"
 CONFIG_PAGE_OFFSET=0xC0000000
 CONFIG_PC104=y