From: Peter Zijlstra <peterz@infradead.org>
From: Peter Zijlstra <peterz@infradead.org>
To: David Woodhouse <dwmw2@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
Josh Poimboeuf <jpoimboe@redhat.com>
Cc: linux-kernel@vger.kernel.org, Dave Hansen <dave.hansen@intel.com>,
Ashok Raj <ashok.raj@intel.com>,
Tim Chen <tim.c.chen@linux.intel.com>,
Andy Lutomirski <luto@kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Greg KH <gregkh@linuxfoundation.org>,
Andrea Arcangeli <aarcange@redhat.com>,
Andi Kleen <ak@linux.intel.com>,
Arjan Van De Ven <arjan.van.de.ven@intel.com>,
Dan Williams <dan.j.williams@intel.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Jun Nakajima <jun.nakajima@intel.com>,
Asit Mallick <asit.k.mallick@intel.com>,
Jason Baron <jbaron@akamai.com>,
Peter Zijlstra <peterz@infradead.org>
Subject: [PATCH 28/35] x86/idle: Control Indirect Branch Speculation in idle
Date: Thu, 18 Jan 2018 14:48:28 +0100 [thread overview]
Message-ID: <20180118140153.138069275@infradead.org> (raw)
In-Reply-To: <20180118134800.711245485@infradead.org>
[-- Attachment #1: x86-idle--Control-Indirect-Branch-Speculation-in-idle.patch --]
[-- Type: text/plain, Size: 2799 bytes --]
From: Thomas Gleixner <tglx@linutronix.de>
Indirect Branch Speculation (IBS) is controlled per physical core. If one
thread disables it then it's disabled for the core. If a thread enters idle
it makes sense to reenable IBS so the sibling thread can run with full
speculation enabled in user space.
This makes only sense in mwait_idle_with_hints() because mwait_idle() can
serve an interrupt immediately before speculation can be stopped again. SKL
which requires IBRS should use mwait_idle_with_hints() so this is a non
issue and in the worst case a missed optimization.
[peterz: fixed stop_indirect_branch_speculation placement]
Originally-by: Tim Chen <tim.c.chen@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
arch/x86/include/asm/mwait.h | 14 ++++++++++++++
arch/x86/kernel/process.c | 14 ++++++++++++++
2 files changed, 28 insertions(+)
--- 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/nospec-branch.h>
#define MWAIT_SUBSTATE_MASK 0xf
#define MWAIT_CSTATE_MASK 0xf
@@ -106,9 +107,22 @@ static inline void mwait_idle_with_hints
mb();
}
+ /*
+ * Indirect Branch Speculation (IBS) is controlled per
+ * physical core. If one thread disables it, then it's
+ * disabled on all threads of the core. The kernel disables
+ * it on entry from user space. Reenable it on the thread
+ * which goes idle so the other thread has a chance to run
+ * with full speculation enabled in userspace.
+ */
+ restart_indirect_branch_speculation();
__monitor((void *)¤t_thread_info()->flags, 0, 0);
if (!need_resched())
__mwait(eax, ecx);
+ /*
+ * Stop IBS again to protect kernel execution.
+ */
+ stop_indirect_branch_speculation();
}
current_clr_polling();
}
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -461,6 +461,20 @@ static __cpuidle void mwait_idle(void)
mb(); /* quirk */
}
+ /*
+ * Indirect Branch Speculation (IBS) is controlled per
+ * physical core. If one thread disables it, then it's
+ * disabled on all threads of the core. The kernel disables
+ * it on entry from user space. For __sti_mwait() it's
+ * wrong to reenable it because an interrupt can be served
+ * before speculation can be stopped again.
+ *
+ * To plug that hole the interrupt entry code would need to
+ * save current state and restore. Not worth the trouble as
+ * SKL should not use mwait_idle(). It should use
+ * mwait_idle_with_hints() which can do speculation control
+ * safely.
+ */
__monitor((void *)¤t_thread_info()->flags, 0, 0);
if (!need_resched())
__sti_mwait(0, 0);
next prev parent reply other threads:[~2018-01-18 15:09 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-18 13:48 [PATCH 00/35] jump_label, objtool, IBRS and IBPB Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 01/35] jump_label: Add branch hints to static_branch_{un,}likely() Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 02/35] sched: Optimize ttwu_stat() Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 03/35] x86: Reindent _static_cpu_has Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 04/35] x86: Update _static_cpu_has to use all named variables Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 05/35] x86: Add a type field to alt_instr Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 06/35] objtool: Implement base jump_assert support Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 07/35] x86: Annotate static_cpu_has alternative Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 08/35] objtool: Implement jump_assert for _static_cpu_has() Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 09/35] objtool: Introduce special_type Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 10/35] x86/jump_label: Implement arch_static_assert() Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 11/35] objtool: Add retpoline validation Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 12/35] x86/paravirt: Annotate indirect calls Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 13/35] x86,nospec: Annotate indirect calls/jumps Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 14/35] x86: Annotate indirect jump in head_64.S Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 15/35] objtool: More complex static jump implementation Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 16/35] objtool: Use existing global variables for options Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 17/35] objtool: Even more complex static block checks Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 18/35] objtool: Another static block fail Peter Zijlstra, Peter Zijlstra
2018-01-19 16:42 ` Peter Zijlstra
2018-01-29 18:01 ` Josh Poimboeuf
2018-01-29 18:24 ` Peter Zijlstra
2018-01-18 13:48 ` [PATCH 19/35] objtool: Skip static assert when KCOV/KASAN Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 20/35] x86: Force asm-goto Peter Zijlstra, Peter Zijlstra
2018-01-18 16:25 ` David Woodhouse
2018-01-18 13:48 ` [PATCH 21/35] x86: Remove FAST_FEATURE_TESTS Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 22/35] x86/cpufeatures: Detect Speculation control feature Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 23/35] x86/speculation: Add basic speculation control code Peter Zijlstra, Peter Zijlstra
2018-01-18 16:37 ` Josh Poimboeuf
2018-01-18 17:08 ` Dave Hansen
2018-01-18 17:12 ` Paolo Bonzini
2018-01-18 18:24 ` Josh Poimboeuf
2018-01-18 19:08 ` Andrea Arcangeli
2018-01-18 23:25 ` Andy Lutomirski
2018-01-18 23:35 ` Andrew Cooper
2018-01-19 1:41 ` Andrea Arcangeli
2018-01-19 4:10 ` Andy Lutomirski
2018-01-19 4:15 ` Van De Ven, Arjan
2018-01-19 15:47 ` Andrea Arcangeli
2018-01-18 13:48 ` [PATCH 24/35] x86/msr: Move native_*msr macros out of microcode.h Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 25/35] x86/speculation: Add inlines to control Indirect Branch Speculation Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 26/35] x86/enter: Create macros to stop/restart " Peter Zijlstra, Peter Zijlstra
2018-01-18 19:44 ` Tim Chen
2018-01-18 13:48 ` [PATCH 27/35] x86/enter: Use IBRS on syscall and interrupts Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` Peter Zijlstra, Peter Zijlstra [this message]
2018-01-18 19:52 ` [PATCH 28/35] x86/idle: Control Indirect Branch Speculation in idle Andrew Cooper
2018-01-18 13:48 ` [PATCH 29/35] x86/speculation: Add IPBP support Peter Zijlstra, Peter Zijlstra
2018-01-18 16:22 ` Josh Poimboeuf
2018-01-18 18:31 ` Borislav Petkov
2018-01-18 18:35 ` Josh Poimboeuf
2018-01-18 18:46 ` Borislav Petkov
2018-01-18 13:48 ` [PATCH 30/35] x86/speculation: Use Indirect Branch Prediction Barrier in context switch Peter Zijlstra, Peter Zijlstra
2018-01-19 0:38 ` Tim Chen
2018-01-19 4:03 ` Kevin Easton
2018-01-19 20:26 ` Tim Chen
2018-01-18 13:48 ` [PATCH 31/35] x86/ibrs: Add new helper macros to save/restore MSR_IA32_SPEC_CTRL Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 32/35] x86/vmx: Direct access to MSR_IA32_SPEC_CTRL Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 33/35] x86/svm: " Peter Zijlstra, Peter Zijlstra
2018-01-18 13:48 ` [PATCH 34/35] x86/kvm: Add IBPB support Peter Zijlstra, Peter Zijlstra
2018-01-18 15:32 ` Paolo Bonzini
2018-01-19 15:25 ` Paolo Bonzini
2018-01-19 16:08 ` David Woodhouse
2018-01-19 16:27 ` Andy Lutomirski
2018-01-19 16:48 ` Paolo Bonzini
2018-01-18 13:48 ` [PATCH 35/35] x86/nospec: Add static assertions Peter Zijlstra, Peter Zijlstra
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=20180118140153.138069275@infradead.org \
--to=peterz@infradead.org \
--cc=aarcange@redhat.com \
--cc=ak@linux.intel.com \
--cc=arjan.van.de.ven@intel.com \
--cc=ashok.raj@intel.com \
--cc=asit.k.mallick@intel.com \
--cc=dan.j.williams@intel.com \
--cc=dave.hansen@intel.com \
--cc=dwmw2@infradead.org \
--cc=gregkh@linuxfoundation.org \
--cc=jbaron@akamai.com \
--cc=jpoimboe@redhat.com \
--cc=jun.nakajima@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=pbonzini@redhat.com \
--cc=tglx@linutronix.de \
--cc=tim.c.chen@linux.intel.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®