[patch 2/3] x86/process: Optimize TIF_BLOCKSTEP switch
From: Thomas Gleixner
Date: Thu Dec 15 2016 - 11:47:40 EST
Provide and use a seperate helper for toggling the DEBUGCTLMSR_BTF bit
instead of doing it open coded with a branch and eventually evaluating
boot_cpu_data twice.
x86_64:
3694 8505 16 12215 2fb7 Before
3662 8505 16 12183 2f97 After
i386:
5986 9388 1804 17178 431a Before
5906 9388 1804 17098 42ca After
Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
---
arch/x86/include/asm/processor.h | 12 ++++++++++++
arch/x86/kernel/process.c | 10 ++--------
2 files changed, 14 insertions(+), 8 deletions(-)
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -676,6 +676,18 @@ static inline void update_debugctlmsr(un
wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr);
}
+static inline void toggle_debugctlmsr(unsigned long mask)
+{
+ unsigned long msrval;
+
+#ifndef CONFIG_X86_DEBUGCTLMSR
+ if (boot_cpu_data.x86 < 6)
+ return;
+#endif
+ rdmsrl(MSR_IA32_DEBUGCTLMSR, msrval);
+ wrmsrl(MSR_IA32_DEBUGCTLMSR, msrval ^ mask);
+}
+
extern void set_task_blockstep(struct task_struct *task, bool on);
/* Boot loader type from the setup header: */
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -209,14 +209,8 @@ void __switch_to_xtra(struct task_struct
propagate_user_return_notify(prev_p, next_p);
- if ((tifp ^ tifn) & _TIF_BLOCKSTEP) {
- unsigned long debugctl = get_debugctlmsr();
-
- debugctl &= ~DEBUGCTLMSR_BTF;
- if (tifn & _TIF_BLOCKSTEP)
- debugctl |= DEBUGCTLMSR_BTF;
- update_debugctlmsr(debugctl);
- }
+ if ((tifp ^ tifn) & _TIF_BLOCKSTEP)
+ toggle_debugctlmsr(DEBUGCTLMSR_BTF);
if ((tifp ^ tifn) & _TIF_NOTSC) {
if (tifn & _TIF_NOTSC)