diff options
-rw-r--r-- | arch/Kconfig | 14 | ||||
-rw-r--r-- | arch/x86/Makefile_32.cpu | 13 | ||||
-rw-r--r-- | include/linux/jump_label.h | 2 |
3 files changed, 27 insertions, 2 deletions
diff --git a/arch/Kconfig b/arch/Kconfig index 53d7f619a1b9..8bf0fa652eb6 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
@@ -42,6 +42,20 @@ config KPROBES | |||
42 | for kernel debugging, non-intrusive instrumentation and testing. | 42 | for kernel debugging, non-intrusive instrumentation and testing. |
43 | If in doubt, say "N". | 43 | If in doubt, say "N". |
44 | 44 | ||
45 | config JUMP_LABEL | ||
46 | bool "Optimize trace point call sites" | ||
47 | depends on HAVE_ARCH_JUMP_LABEL | ||
48 | help | ||
49 | If it is detected that the compiler has support for "asm goto", | ||
50 | the kernel will compile trace point locations with just a | ||
51 | nop instruction. When trace points are enabled, the nop will | ||
52 | be converted to a jump to the trace function. This technique | ||
53 | lowers overhead and stress on the branch prediction of the | ||
54 | processor. | ||
55 | |||
56 | On i386, options added to the compiler flags may increase | ||
57 | the size of the kernel slightly. | ||
58 | |||
45 | config OPTPROBES | 59 | config OPTPROBES |
46 | def_bool y | 60 | def_bool y |
47 | depends on KPROBES && HAVE_OPTPROBES | 61 | depends on KPROBES && HAVE_OPTPROBES |
diff --git a/arch/x86/Makefile_32.cpu b/arch/x86/Makefile_32.cpu index 1255d953c65d..f2ee1abb1df9 100644 --- a/arch/x86/Makefile_32.cpu +++ b/arch/x86/Makefile_32.cpu | |||
@@ -51,7 +51,18 @@ cflags-$(CONFIG_X86_GENERIC) += $(call tune,generic,$(call tune,i686)) | |||
51 | # prologue (push %ebp, mov %esp, %ebp) which breaks the function graph | 51 | # prologue (push %ebp, mov %esp, %ebp) which breaks the function graph |
52 | # tracer assumptions. For i686, generic, core2 this is set by the | 52 | # tracer assumptions. For i686, generic, core2 this is set by the |
53 | # compiler anyway | 53 | # compiler anyway |
54 | cflags-$(CONFIG_FUNCTION_GRAPH_TRACER) += $(call cc-option,-maccumulate-outgoing-args) | 54 | ifeq ($(CONFIG_FUNCTION_GRAPH_TRACER), y) |
55 | ADD_ACCUMULATE_OUTGOING_ARGS := y | ||
56 | endif | ||
57 | |||
58 | # Work around to a bug with asm goto with first implementations of it | ||
59 | # in gcc causing gcc to mess up the push and pop of the stack in some | ||
60 | # uses of asm goto. | ||
61 | ifeq ($(CONFIG_JUMP_LABEL), y) | ||
62 | ADD_ACCUMULATE_OUTGOING_ARGS := y | ||
63 | endif | ||
64 | |||
65 | cflags-$(ADD_ACCUMULATE_OUTGOING_ARGS) += $(call cc-option,-maccumulate-outgoing-args) | ||
55 | 66 | ||
56 | # Bug fix for binutils: this option is required in order to keep | 67 | # Bug fix for binutils: this option is required in order to keep |
57 | # binutils from generating NOPL instructions against our will. | 68 | # binutils from generating NOPL instructions against our will. |
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index 1947a1212678..7880f18e4b86 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef _LINUX_JUMP_LABEL_H | 1 | #ifndef _LINUX_JUMP_LABEL_H |
2 | #define _LINUX_JUMP_LABEL_H | 2 | #define _LINUX_JUMP_LABEL_H |
3 | 3 | ||
4 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_HAVE_ARCH_JUMP_LABEL) | 4 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) |
5 | # include <asm/jump_label.h> | 5 | # include <asm/jump_label.h> |
6 | # define HAVE_JUMP_LABEL | 6 | # define HAVE_JUMP_LABEL |
7 | #endif | 7 | #endif |