diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.9.21/0035-x86-process-Optimize-TIF-checks-in-__switch_to_xtra.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.9.21/0035-x86-process-Optimize-TIF-checks-in-__switch_to_xtra.patch | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.9.21/0035-x86-process-Optimize-TIF-checks-in-__switch_to_xtra.patch b/common/recipes-kernel/linux/linux-yocto-4.9.21/0035-x86-process-Optimize-TIF-checks-in-__switch_to_xtra.patch new file mode 100644 index 00000000..bcbf8f92 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.9.21/0035-x86-process-Optimize-TIF-checks-in-__switch_to_xtra.patch @@ -0,0 +1,125 @@ +From ac5c35e60743b4260df777cc4ac1e877c2999b1d Mon Sep 17 00:00:00 2001 +From: Kyle Huey <me@kylehuey.com> +Date: Tue, 14 Feb 2017 00:11:02 -0800 +Subject: [PATCH 35/93] x86/process: Optimize TIF checks in __switch_to_xtra() + +commit af8b3cd3934ec60f4c2a420d19a9d416554f140b upstream + +Help the compiler to avoid reevaluating the thread flags for each checked +bit by reordering the bit checks and providing an explicit xor for +evaluation. + +With default defconfigs for each arch, + +x86_64: arch/x86/kernel/process.o +text data bss dec hex +3056 8577 16 11649 2d81 Before +3024 8577 16 11617 2d61 After + +i386: arch/x86/kernel/process.o +text data bss dec hex +2957 8673 8 11638 2d76 Before +2925 8673 8 11606 2d56 After + +Originally-by: Thomas Gleixner <tglx@linutronix.de> +Signed-off-by: Kyle Huey <khuey@kylehuey.com> +Cc: Peter Zijlstra <peterz@infradead.org> +Cc: Andy Lutomirski <luto@kernel.org> +Link: http://lkml.kernel.org/r/20170214081104.9244-2-khuey@kylehuey.com +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> + +[dwmw2: backported to make TIF_RDS handling simpler. + No deferred TR reload.] +Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + arch/x86/kernel/process.c | 54 +++++++++++++++++++++++++++-------------------- + 1 file changed, 31 insertions(+), 23 deletions(-) + +diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c +index a55b320..0e1999e 100644 +--- a/arch/x86/kernel/process.c ++++ b/arch/x86/kernel/process.c +@@ -192,48 +192,56 @@ int set_tsc_mode(unsigned int val) + return 0; + } + ++static inline void switch_to_bitmap(struct tss_struct *tss, ++ struct thread_struct *prev, ++ struct thread_struct *next, ++ unsigned long tifp, unsigned long tifn) ++{ ++ if (tifn & _TIF_IO_BITMAP) { ++ /* ++ * Copy the relevant range of the IO bitmap. ++ * Normally this is 128 bytes or less: ++ */ ++ memcpy(tss->io_bitmap, next->io_bitmap_ptr, ++ max(prev->io_bitmap_max, next->io_bitmap_max)); ++ } else if (tifp & _TIF_IO_BITMAP) { ++ /* ++ * Clear any possible leftover bits: ++ */ ++ memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); ++ } ++} ++ + void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, + struct tss_struct *tss) + { + struct thread_struct *prev, *next; ++ unsigned long tifp, tifn; + + prev = &prev_p->thread; + next = &next_p->thread; + +- if (test_tsk_thread_flag(prev_p, TIF_BLOCKSTEP) ^ +- test_tsk_thread_flag(next_p, TIF_BLOCKSTEP)) { ++ tifn = READ_ONCE(task_thread_info(next_p)->flags); ++ tifp = READ_ONCE(task_thread_info(prev_p)->flags); ++ switch_to_bitmap(tss, prev, next, tifp, tifn); ++ ++ propagate_user_return_notify(prev_p, next_p); ++ ++ if ((tifp ^ tifn) & _TIF_BLOCKSTEP) { + unsigned long debugctl = get_debugctlmsr(); + + debugctl &= ~DEBUGCTLMSR_BTF; +- if (test_tsk_thread_flag(next_p, TIF_BLOCKSTEP)) ++ if (tifn & _TIF_BLOCKSTEP) + debugctl |= DEBUGCTLMSR_BTF; +- + update_debugctlmsr(debugctl); + } + +- if (test_tsk_thread_flag(prev_p, TIF_NOTSC) ^ +- test_tsk_thread_flag(next_p, TIF_NOTSC)) { +- /* prev and next are different */ +- if (test_tsk_thread_flag(next_p, TIF_NOTSC)) ++ if ((tifp ^ tifn) & _TIF_NOTSC) { ++ if (tifn & _TIF_NOTSC) + hard_disable_TSC(); + else + hard_enable_TSC(); + } +- +- if (test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) { +- /* +- * Copy the relevant range of the IO bitmap. +- * Normally this is 128 bytes or less: +- */ +- memcpy(tss->io_bitmap, next->io_bitmap_ptr, +- max(prev->io_bitmap_max, next->io_bitmap_max)); +- } else if (test_tsk_thread_flag(prev_p, TIF_IO_BITMAP)) { +- /* +- * Clear any possible leftover bits: +- */ +- memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); +- } +- propagate_user_return_notify(prev_p, next_p); + } + + /* +-- +2.7.4 + |