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 --- 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)