diff options
author | Andy Lutomirski <luto@kernel.org> | 2015-10-05 20:48:20 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-10-09 03:41:12 -0400 |
commit | c68ca6787bdd6d2df37cf950135aa11e71af358a (patch) | |
tree | e4c1c92be7f20cd4dc4b74ed605d494bc4154afb /arch/x86/entry/common.c | |
parent | 33c52129f45e06d9ce23e1a3d50bf9fd6770748b (diff) |
x86/entry: Micro-optimize compat fast syscall arg fetch
We're following a 32-bit pointer, and the uaccess code isn't
smart enough to figure out that the access_ok() check isn't
needed.
This saves about three cycles on a cache-hot fast syscall.
Signed-off-by: Andy Lutomirski <luto@kernel.org>
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: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Link: http://lkml.kernel.org/r/bdff034e2f23c5eb974c760cf494cb5bddce8f29.1444091585.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/entry/common.c')
-rw-r--r-- | arch/x86/entry/common.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c index d5eee851071c..08a945d7915e 100644 --- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c | |||
@@ -394,8 +394,20 @@ __visible long do_fast_syscall_32(struct pt_regs *regs) | |||
394 | * WARNING: We are in CONTEXT_USER and RCU isn't paying attention! | 394 | * WARNING: We are in CONTEXT_USER and RCU isn't paying attention! |
395 | */ | 395 | */ |
396 | local_irq_enable(); | 396 | local_irq_enable(); |
397 | if (get_user(*(u32 *)®s->cx, | 397 | if ( |
398 | (u32 __user __force *)(unsigned long)(u32)regs->sp)) { | 398 | #ifdef CONFIG_X86_64 |
399 | /* | ||
400 | * Micro-optimization: the pointer we're following is explicitly | ||
401 | * 32 bits, so it can't be out of range. | ||
402 | */ | ||
403 | __get_user(*(u32 *)®s->cx, | ||
404 | (u32 __user __force *)(unsigned long)(u32)regs->sp) | ||
405 | #else | ||
406 | get_user(*(u32 *)®s->cx, | ||
407 | (u32 __user __force *)(unsigned long)(u32)regs->sp) | ||
408 | #endif | ||
409 | ) { | ||
410 | |||
399 | /* User code screwed up. */ | 411 | /* User code screwed up. */ |
400 | local_irq_disable(); | 412 | local_irq_disable(); |
401 | regs->ax = -EFAULT; | 413 | regs->ax = -EFAULT; |