Commit 478dc89c authored by Andy Lutomirski's avatar Andy Lutomirski Committed by Ingo Molnar

x86/entry/64: Bypass enter_from_user_mode on non-context-tracking boots

On CONFIG_CONTEXT_TRACKING kernels that have context tracking
disabled at runtime (which includes most distro kernels), we
still have the overhead of a call to enter_from_user_mode in
interrupt and exception entries.

If jump labels are available, this uses the jump label
infrastructure to skip the call.
Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/73ee804fff48cd8c66b65b724f9f728a11a8c686.1447361906.git.luto@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 2671c3e4
#include <linux/jump_label.h>
/* /*
x86 function call convention, 64-bit: x86 function call convention, 64-bit:
...@@ -232,3 +234,16 @@ For 32-bit we have the following conventions - kernel is built with ...@@ -232,3 +234,16 @@ For 32-bit we have the following conventions - kernel is built with
#endif /* CONFIG_X86_64 */ #endif /* CONFIG_X86_64 */
/*
* This does 'call enter_from_user_mode' unless we can avoid it based on
* kernel config or using the static jump infrastructure.
*/
.macro CALL_enter_from_user_mode
#ifdef CONFIG_CONTEXT_TRACKING
#ifdef HAVE_JUMP_LABEL
STATIC_JUMP_IF_FALSE .Lafter_call_\@, context_tracking_enabled, def=0
#endif
call enter_from_user_mode
.Lafter_call_\@:
#endif
.endm
...@@ -520,9 +520,7 @@ END(irq_entries_start) ...@@ -520,9 +520,7 @@ END(irq_entries_start)
*/ */
TRACE_IRQS_OFF TRACE_IRQS_OFF
#ifdef CONFIG_CONTEXT_TRACKING CALL_enter_from_user_mode
call enter_from_user_mode
#endif
1: 1:
/* /*
...@@ -1066,9 +1064,7 @@ ENTRY(error_entry) ...@@ -1066,9 +1064,7 @@ ENTRY(error_entry)
* (which can take locks). * (which can take locks).
*/ */
TRACE_IRQS_OFF TRACE_IRQS_OFF
#ifdef CONFIG_CONTEXT_TRACKING CALL_enter_from_user_mode
call enter_from_user_mode
#endif
ret ret
.Lerror_entry_done: .Lerror_entry_done:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment