| From 97245d00585d82540f4538cf72d92a1e853c7b0e Mon Sep 17 00:00:00 2001 |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| Date: Tue, 13 Sep 2016 14:29:22 -0700 |
| Subject: [PATCH] x86/entry: Get rid of pt_regs_to_thread_info() |
| |
| commit 97245d00585d82540f4538cf72d92a1e853c7b0e upstream. |
| |
| It was a nice optimization while it lasted, but thread_info is moving |
| and this optimization will no longer work. |
| |
| Quoting Linus: |
| |
| Oh Gods, Andy. That pt_regs_to_thread_info() thing made me want |
| to do unspeakable acts on a poor innocent wax figure that looked |
| _exactly_ like you. |
| |
| [ Changelog written by Andy. ] |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Andy Lutomirski <luto@kernel.org> |
| 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: Jann Horn <jann@thejh.net> |
| Cc: Josh Poimboeuf <jpoimboe@redhat.com> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Link: http://lkml.kernel.org/r/6376aa81c68798cc81631673f52bd91a3e078944.1473801993.git.luto@kernel.org |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| |
| diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c |
| index 871bbf975d4c..bdd9cc59d20f 100644 |
| --- a/arch/x86/entry/common.c |
| +++ b/arch/x86/entry/common.c |
| @@ -31,13 +31,6 @@ |
| #define CREATE_TRACE_POINTS |
| #include <trace/events/syscalls.h> |
| |
| -static struct thread_info *pt_regs_to_thread_info(struct pt_regs *regs) |
| -{ |
| - unsigned long top_of_stack = |
| - (unsigned long)(regs + 1) + TOP_OF_KERNEL_STACK_PADDING; |
| - return (struct thread_info *)(top_of_stack - THREAD_SIZE); |
| -} |
| - |
| #ifdef CONFIG_CONTEXT_TRACKING |
| /* Called on entry from user mode with IRQs off. */ |
| __visible inline void enter_from_user_mode(void) |
| @@ -71,7 +64,7 @@ static long syscall_trace_enter(struct pt_regs *regs) |
| { |
| u32 arch = in_ia32_syscall() ? AUDIT_ARCH_I386 : AUDIT_ARCH_X86_64; |
| |
| - struct thread_info *ti = pt_regs_to_thread_info(regs); |
| + struct thread_info *ti = current_thread_info(); |
| unsigned long ret = 0; |
| bool emulated = false; |
| u32 work; |
| @@ -173,18 +166,17 @@ static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags) |
| /* Disable IRQs and retry */ |
| local_irq_disable(); |
| |
| - cached_flags = READ_ONCE(pt_regs_to_thread_info(regs)->flags); |
| + cached_flags = READ_ONCE(current_thread_info()->flags); |
| |
| if (!(cached_flags & EXIT_TO_USERMODE_LOOP_FLAGS)) |
| break; |
| - |
| } |
| } |
| |
| /* Called with IRQs disabled. */ |
| __visible inline void prepare_exit_to_usermode(struct pt_regs *regs) |
| { |
| - struct thread_info *ti = pt_regs_to_thread_info(regs); |
| + struct thread_info *ti = current_thread_info(); |
| u32 cached_flags; |
| |
| if (IS_ENABLED(CONFIG_PROVE_LOCKING) && WARN_ON(!irqs_disabled())) |
| @@ -247,7 +239,7 @@ static void syscall_slow_exit_work(struct pt_regs *regs, u32 cached_flags) |
| */ |
| __visible inline void syscall_return_slowpath(struct pt_regs *regs) |
| { |
| - struct thread_info *ti = pt_regs_to_thread_info(regs); |
| + struct thread_info *ti = current_thread_info(); |
| u32 cached_flags = READ_ONCE(ti->flags); |
| |
| CT_WARN_ON(ct_state() != CONTEXT_KERNEL); |
| @@ -270,7 +262,7 @@ __visible inline void syscall_return_slowpath(struct pt_regs *regs) |
| #ifdef CONFIG_X86_64 |
| __visible void do_syscall_64(struct pt_regs *regs) |
| { |
| - struct thread_info *ti = pt_regs_to_thread_info(regs); |
| + struct thread_info *ti = current_thread_info(); |
| unsigned long nr = regs->orig_ax; |
| |
| enter_from_user_mode(); |
| @@ -303,7 +295,7 @@ __visible void do_syscall_64(struct pt_regs *regs) |
| */ |
| static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) |
| { |
| - struct thread_info *ti = pt_regs_to_thread_info(regs); |
| + struct thread_info *ti = current_thread_info(); |
| unsigned int nr = (unsigned int)regs->orig_ax; |
| |
| #ifdef CONFIG_IA32_EMULATION |
| -- |
| 2.15.0 |
| |