lkml.org 
[lkml]   [2016]   [Dec]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[patch 2/3] x86/process: Optimize TIF_BLOCKSTEP switch
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@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)

\
 
 \ /
  Last update: 2016-12-15 17:48    [W:0.506 / U:0.308 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site