[Patch 4/4] Tell GCC 4.1 to move unlikely() code to a separatesection

From: Arjan van de Ven
Date: Mon Feb 27 2006 - 10:30:33 EST


This patch is more controversial I assume; it offers the option
to use the gcc 4.1 option to move unlikely() code to a separate section.
On the con side, this means that longer byte sequences are needed to jump
to this code, on the Pro side it means that the unlikely() code isn't sharing
icache cachelines and tlbs anymore.

Signed-off-by: Arjan van de Ven <arjan@xxxxxxxxxxxxxxx>

---
arch/x86_64/Kconfig.debug | 10 ++++++++++
arch/x86_64/Makefile | 4 ++++
2 files changed, 14 insertions(+)

Index: linux-reorder2/arch/x86_64/Kconfig.debug
===================================================================
--- linux-reorder2.orig/arch/x86_64/Kconfig.debug
+++ linux-reorder2/arch/x86_64/Kconfig.debug
@@ -12,6 +12,16 @@ config DEBUG_RODATA
of the kernel code won't be covered by a 2MB TLB anymore.
If in doubt, say "N".

+config REORDER_BLOCKS
+ bool "Enable gcc to move unlikely() code away"
+ depends on DEBUG_KERNEL
+ help
+ This option will enable gcc 4.1 and later to reorder code that is
+ marked unlikely() far away from the code to the end of the kernel
+ image. This allows the processor to make better use of the instruction
+ cache, however it also makes OOPses harder to decode.
+ If in doubt, say "N"
+
config IOMMU_DEBUG
depends on GART_IOMMU && DEBUG_KERNEL
bool "Enable IOMMU debugging"
Index: linux-reorder2/arch/x86_64/Makefile
===================================================================
--- linux-reorder2.orig/arch/x86_64/Makefile
+++ linux-reorder2/arch/x86_64/Makefile
@@ -47,6 +47,10 @@ ifneq ($(CONFIG_DEBUG_INFO),y)
# -fweb shrinks the kernel a bit, but the difference is very small
# it also messes up debugging, so don't use it for now.
#CFLAGS += $(call cc-option,-fweb)
+# -freorder-blocks-and-partition moves all unlikely() code out of the
+# way, to increase icache density of the hot codepaths.
+# this makes oopses harder to read as well, so it's a config option
+cflags-$(CONFIG_REORDER_BLOCKS) += $(call cc-option,-freorder-blocks-and-partition)
endif
# -funit-at-a-time shrinks the kernel .text considerably
# unfortunately it makes reading oopses harder.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/