Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756478AbcLOQrZ (ORCPT ); Thu, 15 Dec 2016 11:47:25 -0500 Received: from Galois.linutronix.de ([146.0.238.70]:47775 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752693AbcLOQrW (ORCPT ); Thu, 15 Dec 2016 11:47:22 -0500 Message-Id: <20161215164240.813682510@linutronix.de> User-Agent: quilt/0.63-1 Date: Thu, 15 Dec 2016 16:44:02 -0000 From: Thomas Gleixner To: LKML Cc: x86@kernel.org, Peter Zijlstra , Kyle Huey , Andy Lutomirski Subject: [patch 2/3] x86/process: Optimize TIF_BLOCKSTEP switch References: <20161215162648.061449202@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=x86-process--Optimize-TIF_BLOCKSTEP-switch.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1678 Lines: 59 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)