Patch "x86/asm: Move 'status' from thread_struct to thread_info" has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
x86/asm: Move 'status' from thread_struct to thread_info
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-asm-move-status-from-thread_struct-to-thread_info.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Feb 8 03:32:24 CET 2018
From: Andy Lutomirski <[email protected]>
Date: Sun, 28 Jan 2018 10:38:50 -0800
Subject: x86/asm: Move 'status' from thread_struct to thread_info
From: Andy Lutomirski <[email protected]>
(cherry picked from commit 37a8f7c38339b22b69876d6f5a0ab851565284e3)
The TS_COMPAT bit is very hot and is accessed from code paths that mostly also touch thread_info::flags. Move it into struct thread_info to improve cache locality.
The only reason it was in thread_struct is that there was a brief period during which arch-specific fields were not allowed in struct thread_info.
Linus suggested further changing:
ti->status &= ~(TS_COMPAT|TS_I386_REGS_POKED);
to:
if (unlikely(ti->status & (TS_COMPAT|TS_I386_REGS_POKED)))
ti->status &= ~(TS_COMPAT|TS_I386_REGS_POKED);on the theory that frequently dirtying the cacheline even in pure 64-bit code that never needs to modify status hurts performance. That could be a reasonable followup patch, but I suspect it matters less on top of this patch.
--- arch/x86/entry/common.c | 4 ++-- arch/x86/include/asm/processor.h | 2 -- arch/x86/include/asm/syscall.h | 6 +++--- arch/x86/include/asm/thread_info.h | 3 ++- arch/x86/kernel/process_64.c | 4 ++-- arch/x86/kernel/ptrace.c | 2 +- arch/x86/kernel/signal.c | 2 +- 7 files changed, 11 insertions(+), 12 deletions(-)
arch/x86/entry/common.c +2 -2
@@ -201,7 +201,7 @@ __visible inline void prepare_exit_to_us* special case only applies after poking regs and before the * very next return to user mode. */ - current->thread.status &= ~(TS_COMPAT |TS_I386_REGS_POKED ); + ti->status &= ~(TS_COMPAT |TS_I386_REGS_POKED );#endif user_enter_irqoff ();
@@ -299,7 +299,7 @@ static __always_inline void do_syscall_3unsigned int nr = (unsigned int )regs->orig_ax;#ifdef CONFIG_IA32_EMULATION - current->thread.status |=TS_COMPAT ; + ti->status |=TS_COMPAT ;#endif if (READ_ONCE (ti->flags) & _TIF_WORK_SYSCALL_ENTRY) {
arch/x86/include/asm/processor.h +0 -2
@@ -391,8 +391,6 @@ struct thread_struct {unsigned short gsindex;#endif -u32 status;/* thread synchronous flags */ -#ifdef CONFIG_X86_64 unsigned long fsbase;unsigned long gsbase;
arch/x86/include/asm/syscall.h +3 -3
@@ -60,7 +60,7 @@ static inline long syscall_get_error(str* TS_COMPAT is set for 32-bit syscall entries and then * remains set until we return to user mode. */ -if (task->thread.status & (TS_COMPAT |TS_I386_REGS_POKED )) +if (task->thread_info.status & (TS_COMPAT |TS_I386_REGS_POKED ))/* * Sign-extend the value so (int)-EFOO becomes (long)-EFOO * and will match correctly in comparisons.
@@ -116,7 +116,7 @@ static inline void syscall_get_arguments unsigned long *args) {# ifdef CONFIG_IA32_EMULATION -if (task->thread.status &TS_COMPAT ) +if (task->thread_info.status &TS_COMPAT )switch (i) {case 0 :if (!n--)break ;
@@ -177,7 +177,7 @@ static inline void syscall_set_arguments const unsigned long *args) {# ifdef CONFIG_IA32_EMULATION -if (task->thread.status &TS_COMPAT ) +if (task->thread_info.status &TS_COMPAT )switch (i) {case 0 :if (!n--)break ;
arch/x86/include/asm/thread_info.h +2 -1
@@ -54,6 +54,7 @@ struct task_struct;struct thread_info {unsigned long flags;/* low level flags */ +u32 status;/* thread synchronous flags */ };#define INIT_THREAD_INFO (tsk) \
@@ -213,7 +214,7 @@ static inline int arch_within_stack_fram#define in_ia32_syscall () true#else #define in_ia32_syscall () (IS_ENABLED(CONFIG_IA32_EMULATION) && \ - current->thread.status & TS_COMPAT) + current_thread_info()->status & TS_COMPAT)#endif /*
arch/x86/kernel/process_64.c +2 -2
@@ -538,7 +538,7 @@ void set_personality_ia32(bool x32) current->personality &= ~READ_IMPLIES_EXEC ;/* in_compat_syscall() uses the presence of the x32 syscall bit flag to determine compat status */ - current->thread.status &= ~TS_COMPAT ; +current_thread_info ()->status &= ~TS_COMPAT ; }else {set_thread_flag (TIF_IA32 );clear_thread_flag (TIF_X32 );
@@ -546,7 +546,7 @@ void set_personality_ia32(bool x32) current->mm->context.ia32_compat =TIF_IA32 ; current->personality |= force_personality32;/* Prepare the first "return" to user space */ - current->thread.status |=TS_COMPAT ; +current_thread_info ()->status |=TS_COMPAT ; } }EXPORT_SYMBOL_GPL (set_personality_ia32);
arch/x86/kernel/ptrace.c +1 -1
@@ -934,7 +934,7 @@ static int putreg32(struct task_struct **/ regs->orig_ax = value;if (syscall_get_nr (child, regs) >=0 ) - child->thread.status |=TS_I386_REGS_POKED ; + child->thread_info.status |=TS_I386_REGS_POKED ;break ; case offsetof(struct user32, regs.eflags):
arch/x86/kernel/signal.c +1 -1
@@ -785,7 +785,7 @@ static inline unsigned long get_nr_resta* than the tracee. */ #ifdef CONFIG_IA32_EMULATION -if (current->thread.status & (TS_COMPAT |TS_I386_REGS_POKED )) +if (current_thread_info ()->status & (TS_COMPAT |TS_I386_REGS_POKED ))return __NR_ia32_restart_syscall;#endif #ifdef CONFIG_X86_X32_ABI
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/x86-entry-64-push-extra-regs-right-away.patch queue-4.9/kvm-vmx-allow-direct-access-to-msr_ia32_spec_ctrl.patch queue-4.9/kvm-x86-add-ibpb-support.patch queue-4.9/kvm-svm-allow-direct-access-to-msr_ia32_spec_ctrl.patch queue-4.9/x86-paravirt-remove-noreplace-paravirt-cmdline-option.patch queue-4.9/x86-asm-move-status-from-thread_struct-to-thread_info.patch queue-4.9/kvm-x86-make-indirect-calls-in-emulator-speculation-safe.patch queue-4.9/x86-entry-64-remove-the-syscall64-fast-path.patch queue-4.9/x86-asm-fix-inline-asm-call-constraints-for-gcc-4.4.patch queue-4.9/kvm-vmx-make-indirect-call-speculation-safe.patch queue-4.9/x86-spectre-fix-spelling-mistake-vunerable-vulnerable.patch queue-4.9/x86-get_user-use-pointer-masking-to-limit-speculation.patch queue-4.9/x86-syscall-sanitize-syscall-table-de-references-under-speculation.patch queue-4.9/x86-pti-make-unpoison-of-pgd-for-trusted-boot-work-for-real.patch queue-4.9/x86-pti-mark-constant-arrays-as-__initconst.patch queue-4.9/kvm-vmx-emulate-msr_ia32_arch_capabilities.patch