All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tim Chen <tim.c.chen@linux.intel.com>
To: Thomas Gleixner <tglx@linutronix.de>,
	Andy Lutomirski <luto@kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Greg KH <gregkh@linuxfoundation.org>
Cc: Tim Chen <tim.c.chen@linux.intel.com>,
	Dave Hansen <dave.hansen@intel.com>,
	Andrea Arcangeli <aarcange@redhat.com>,
	Andi Kleen <ak@linux.intel.com>,
	Arjan Van De Ven <arjan.van.de.ven@intel.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH 4/7] x86/idle: Disable IBRS entering idle and enable it on wakeup
Date: Thu,  4 Jan 2018 09:56:45 -0800	[thread overview]
Message-ID: <50b92931dd3cd403d60e69533f5583bbdbbb88d0.1515086770.git.tim.c.chen@linux.intel.com> (raw)
In-Reply-To: <cover.1515086770.git.tim.c.chen@linux.intel.com>
In-Reply-To: <cover.1515086770.git.tim.c.chen@linux.intel.com>

Clear IBRS on idle entry and set it on idle exit into kernel on mwait.
When we are in mwait, we are not running but if we leave IBRS on,
it will affect the performance on the sibling hardware thread.  So
we disable IBRS and reenable it when we wake up.

Modify my original implementation of IBRS on mwait idle path based on input from
Andrea Arcangeli.

Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com>
---
 arch/x86/include/asm/mwait.h     | 19 +++++++++++++++++++
 arch/x86/include/asm/spec_ctrl.h | 37 +++++++++++++++++++++++++++++++++++++
 arch/x86/kernel/process.c        |  9 +++++++--
 3 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h
index 39a2fb2..5cb3bff 100644
--- a/arch/x86/include/asm/mwait.h
+++ b/arch/x86/include/asm/mwait.h
@@ -6,6 +6,7 @@
 #include <linux/sched/idle.h>
 
 #include <asm/cpufeature.h>
+#include <asm/spec_ctrl.h>
 
 #define MWAIT_SUBSTATE_MASK		0xf
 #define MWAIT_CSTATE_MASK		0xf
@@ -100,15 +101,33 @@ static inline void __sti_mwait(unsigned long eax, unsigned long ecx)
 static inline void mwait_idle_with_hints(unsigned long eax, unsigned long ecx)
 {
 	if (static_cpu_has_bug(X86_BUG_MONITOR) || !current_set_polling_and_test()) {
+		bool can_toggle_ibrs = false;
 		if (static_cpu_has_bug(X86_BUG_CLFLUSH_MONITOR)) {
 			mb();
 			clflush((void *)&current_thread_info()->flags);
 			mb();
 		}
 
+		if (irqs_disabled()) {
+		       /*
+			* CPUs run faster with speculation protection
+			* disabled.  All CPU threads in a core must
+			* disable speculation protection for it to be
+			* disabled.  Disable it while we are idle so the
+			* other hyperthread can run fast.
+			*
+			* nmi uses the save_paranoid model which
+			* always enables ibrs on exception entry
+			* before any indirect jump can run.
+			*/
+			can_toggle_ibrs = true;
+			unprotected_speculation_begin();
+		}
 		__monitor((void *)&current_thread_info()->flags, 0, 0);
 		if (!need_resched())
 			__mwait(eax, ecx);
+		if (can_toggle_ibrs)
+			unprotected_speculation_end();
 	}
 	current_clr_polling();
 }
diff --git a/arch/x86/include/asm/spec_ctrl.h b/arch/x86/include/asm/spec_ctrl.h
index 16fc4f58..28b0314 100644
--- a/arch/x86/include/asm/spec_ctrl.h
+++ b/arch/x86/include/asm/spec_ctrl.h
@@ -76,5 +76,42 @@
 10:
 .endm
 
+#else
+#include <asm/microcode.h>
+
+static inline void __disable_indirect_speculation(void)
+{
+        native_wrmsrl(MSR_IA32_SPEC_CTRL, SPEC_CTRL_FEATURE_ENABLE_IBRS);
+}
+
+static inline void __enable_indirect_speculation(void)
+{
+        native_wrmsrl(MSR_IA32_SPEC_CTRL, SPEC_CTRL_FEATURE_DISABLE_IBRS);
+}
+
+/*
+ * Interrupts must be disabled to begin unprotected speculation.
+ * Otherwise interrupts could be running in unprotected mode.
+ */
+static inline void unprotected_speculation_begin(void)
+{
+	WARN_ON_ONCE(!irqs_disabled());
+	if (boot_cpu_has(X86_FEATURE_SPEC_CTRL))
+		__enable_indirect_speculation();
+}
+
+static inline void unprotected_speculation_end(void)
+{
+	if (boot_cpu_has(X86_FEATURE_SPEC_CTRL))
+		__disable_indirect_speculation();
+	else
+		/*
+		 * If we intended to disable indirect speculation
+		 * but come here due to mis-speculation, we need
+		 * to stop the mis-speculation with rmb.
+		 */
+		rmb();
+}
+
 #endif /* __ASSEMBLY__ */
 #endif /* _ASM_X86_SPEC_CTRL_H */
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 5174159..cb14820 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -39,6 +39,7 @@
 #include <asm/switch_to.h>
 #include <asm/desc.h>
 #include <asm/prctl.h>
+#include <asm/spec_ctrl.h>
 
 /*
  * per-CPU TSS segments. Threads are completely 'soft' on Linux,
@@ -461,11 +462,15 @@ static __cpuidle void mwait_idle(void)
 			mb(); /* quirk */
 		}
 
+		unprotected_speculation_begin();
 		__monitor((void *)&current_thread_info()->flags, 0, 0);
-		if (!need_resched())
+		if (!need_resched()) {
 			__sti_mwait(0, 0);
-		else
+			unprotected_speculation_end();
+		} else {
+			unprotected_speculation_end();
 			local_irq_enable();
+		}
 		trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
 	} else {
 		local_irq_enable();
-- 
2.9.4

  parent reply	other threads:[~2018-01-04 18:18 UTC|newest]

Thread overview: 114+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-04 17:56 [PATCH 0/7] IBRS patch series Tim Chen
2018-01-04 17:56 ` [PATCH 1/7] x86/feature: Detect the x86 feature to control Speculation Tim Chen
2018-01-04 19:58   ` Greg KH
2018-01-04 20:47     ` Tim Chen
2018-01-05 11:14   ` David Woodhouse
2018-01-05 15:14     ` Tom Lendacky
2018-01-05 17:07       ` Tim Chen
2018-01-05 13:09   ` Thomas Gleixner
2018-01-05 13:44     ` Andrea Arcangeli
2018-01-05 13:51       ` Thomas Gleixner
2018-01-04 17:56 ` [PATCH 2/7] x86/enter: MACROS to set/clear IBRS Tim Chen
2018-01-04 22:16   ` Peter Zijlstra
2018-01-04 22:21     ` Tim Chen
2018-01-04 22:23       ` Dave Hansen
2018-01-05  4:54         ` Andy Lutomirski
2018-01-05  5:05           ` Dave Hansen
2018-01-05 13:19       ` Thomas Gleixner
2018-01-04 17:56 ` [PATCH 3/7] x86/enter: Use IBRS on syscall and interrupts Tim Chen
2018-01-04 20:00   ` Greg KH
2018-01-04 20:26     ` Tim Chen
2018-01-04 20:45   ` Dave Hansen
2018-01-04 22:33   ` Peter Zijlstra
2018-01-04 23:12     ` Andrea Arcangeli
2018-01-05  0:08     ` Dave Hansen
2018-01-05  4:51       ` Andy Lutomirski
2018-01-05  5:11         ` Dave Hansen
2018-01-05 12:01           ` Alan Cox
2018-01-05 13:35   ` Thomas Gleixner
2018-01-04 17:56 ` Tim Chen [this message]
2018-01-04 22:47   ` [PATCH 4/7] x86/idle: Disable IBRS entering idle and enable it on wakeup Peter Zijlstra
2018-01-04 23:00     ` Andrea Arcangeli
2018-01-04 23:22     ` Tim Chen
2018-01-04 23:42       ` Andrea Arcangeli
2018-01-04 23:45         ` Thomas Gleixner
2018-01-05  0:03           ` Andrea Arcangeli
2018-01-08  8:24       ` Peter Zijlstra
2018-01-04 17:56 ` [PATCH 5/7] x86: Use IBRS for firmware update path Tim Chen
2018-01-04 18:48   ` Alan Cox
2018-01-04 20:05   ` Greg KH
2018-01-04 20:08     ` Woodhouse, David
2018-01-05 16:08       ` gregkh
2018-01-05 16:37         ` Andrea Arcangeli
2018-01-04 20:21     ` Andrew Cooper
2018-01-04 20:48     ` Andrea Arcangeli
2018-01-04 20:51   ` Yves-Alexis Perez
2018-01-04 21:13     ` Tim Chen
2018-01-04 22:51   ` Peter Zijlstra
2018-01-05 13:40   ` Thomas Gleixner
2018-01-04 17:56 ` [PATCH 6/7] x86/spec_ctrl: Add sysctl knobs to enable/disable SPEC_CTRL feature Tim Chen
2018-01-04 18:33   ` Borislav Petkov
2018-01-04 18:36     ` Dave Hansen
2018-01-04 18:52       ` Borislav Petkov
2018-01-04 18:57         ` Andrea Arcangeli
2018-01-04 18:59         ` Dave Hansen
2018-01-04 19:06           ` Borislav Petkov
2018-01-05 13:48       ` Thomas Gleixner
2018-01-04 18:38     ` Andrea Arcangeli
2018-01-04 18:54       ` Dave Hansen
2018-01-04 18:56         ` Borislav Petkov
2018-01-04 18:55       ` Borislav Petkov
2018-01-04 18:34   ` Andrea Arcangeli
2018-01-04 19:02     ` Tim Chen
2018-01-04 18:50   ` Alan Cox
2018-01-04 20:16   ` Greg KH
2018-01-04 20:58     ` Tim Chen
2018-01-04 22:54   ` Peter Zijlstra
2018-01-04 23:26     ` Tim Chen
2018-01-04 23:51       ` Andrea Arcangeli
2018-01-04 23:59         ` Borislav Petkov
2018-01-05  0:07           ` Thomas Gleixner
2018-01-05 11:16   ` David Woodhouse
2018-01-06  1:29     ` Tim Chen
2018-01-04 17:56 ` [PATCH 7/7] x86/microcode: Recheck IBRS features on microcode reload Tim Chen
2018-01-04 18:28   ` Borislav Petkov
2018-01-04 18:34     ` Andrea Arcangeli
2018-01-04 18:50       ` Borislav Petkov
2018-01-04 19:10         ` Tim Chen
2018-01-05 13:32         ` Greg KH
2018-01-05 13:37           ` Borislav Petkov
2018-01-05 13:47             ` Greg KH
2018-01-05 15:28           ` Andrea Arcangeli
2018-01-04 19:00 ` [PATCH 0/7] IBRS patch series Linus Torvalds
2018-01-04 19:19   ` David Woodhouse
2018-01-04 19:33     ` Linus Torvalds
2018-01-04 19:39       ` David Woodhouse
2018-01-04 19:40       ` Andrew Cooper
2018-01-04 19:46         ` David Woodhouse
2018-01-04 21:22       ` Van De Ven, Arjan
2018-01-05 11:32         ` Paolo Bonzini
2018-01-05 12:09           ` Paul Turner
2018-01-05 14:45           ` Van De Ven, Arjan
2018-01-05 14:43         ` Andrea Arcangeli
2018-01-05 14:52           ` Van De Ven, Arjan
2018-01-05 15:03             ` Andrea Arcangeli
2018-01-05 14:54           ` Thomas Gleixner
2018-01-05 11:52       ` Paul Turner
2018-01-05 14:28         ` David Woodhouse
2018-01-05 14:42           ` Van De Ven, Arjan
2018-01-05 15:38             ` David Woodhouse
2018-01-05 16:05               ` Andrea Arcangeli
2018-01-05 16:37                 ` David Woodhouse
2018-01-05 16:42                   ` Andrea Arcangeli
2018-01-05 16:44                     ` Van De Ven, Arjan
2018-01-05 16:46                     ` David Woodhouse
2018-01-05  5:25   ` Florian Weimer
2018-01-05 11:05     ` David Woodhouse
2018-01-04 19:05 ` Justin Forbes
2018-01-04 19:10   ` Tim Chen
2018-01-04 21:01     ` Yves-Alexis Perez
2018-01-05 13:28       ` Greg KH
2018-01-05 13:47         ` Yves-Alexis Perez
2018-01-05 14:01           ` Greg KH
2018-01-05 14:26             ` Paolo Bonzini
2018-01-05 14:54               ` Yves-Alexis Perez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50b92931dd3cd403d60e69533f5583bbdbbb88d0.1515086770.git.tim.c.chen@linux.intel.com \
    --to=tim.c.chen@linux.intel.com \
    --cc=aarcange@redhat.com \
    --cc=ak@linux.intel.com \
    --cc=arjan.van.de.ven@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.