Messages in this thread Patch in this message | | | From | Andy Lutomirski <> | Subject | [RFC 30/30] x86/entry: Micro-optimize compat fast syscall arg fetch | Date | Tue, 1 Sep 2015 15:41:30 -0700 |
| |
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> --- arch/x86/entry/common.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c index a3c4e7aa573b..ba469579c41a 100644 --- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c @@ -390,8 +390,20 @@ __visible long do_fast_syscall_32(struct pt_regs *regs) * WARNING: We are in CONTEXT_USER and RCU isn't paying attention! */ local_irq_enable(); - if (get_user(*(u32 *)®s->cx, - (u32 __user __force *)(unsigned long)(u32)regs->sp)) { + if ( +#ifdef CONFIG_X86_64 + /* + * Micro-optimization: the pointer we're following is explicitly + * 32 bits, so it can't be out of range. + */ + __get_user(*(u32 *)®s->cx, + (u32 __user __force *)(unsigned long)(u32)regs->sp) +#else + get_user(*(u32 *)®s->cx, + (u32 __user __force *)(unsigned long)(u32)regs->sp) +#endif + ) { + /* User code screwed up. */ local_irq_disable(); regs->ax = -EFAULT; -- 2.4.3
| |