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 <t...@linutronix.de>
---
 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)


Reply via email to