From: Andi Kleen <andi@firstfloor.org>
To: dwmw2@infradead.org
Cc: pjt@google.com, linux-kernel@vger.kernel.org,
torvalds@linux-foundation.org, gregkh@linux-foundation.org,
tim.c.chen@linux.intel.com, dave.hansen@intel.com,
tglx@linutronix.de, peterz@infradead.org, luto@amacapital.net,
Andi Kleen <ak@linux.intel.com>
Subject: [PATCH] x86/retpoline: Also fill return buffer after idle
Date: Mon, 8 Jan 2018 15:51:26 -0800 [thread overview]
Message-ID: <20180108235126.28736-1-andi@firstfloor.org> (raw)
From: Andi Kleen <ak@linux.intel.com>
This is an extension of the earlier patch to fill the return buffer
on context switch. It uses the assembler macros added earlier.
When we go into deeper idle states the return buffer could be cleared
in MWAIT, but then another thread which wakes up earlier might
be poisoning the indirect branch predictor. Then when the return
buffer underflows there might an uncontrolled indirect branch.
To guard against this always fill the return buffer when exiting idle.
Needed on Skylake and some Broadwells.
Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
arch/x86/entry/entry_32.S | 8 ++++++++
arch/x86/entry/entry_64.S | 8 ++++++++
arch/x86/include/asm/mwait.h | 11 ++++++++++-
3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index 7dee84a3cf83..2687cce8a02e 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -1092,3 +1092,11 @@ ENTRY(rewind_stack_do_exit)
call do_exit
1: jmp 1b
END(rewind_stack_do_exit)
+
+ENTRY(fill_return_buffer)
+#ifdef CONFIG_RETPOLINE
+ ALTERNATIVE "ret", "", X86_FEATURE_RETPOLINE
+ FILL_RETURN_BUFFER
+#endif
+ ret
+END(fill_return_buffer)
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index a33033e2bfe0..92fbec1b0eb5 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -1831,3 +1831,11 @@ ENTRY(rewind_stack_do_exit)
call do_exit
END(rewind_stack_do_exit)
+
+ENTRY(fill_return_buffer)
+#ifdef CONFIG_RETPOLINE
+ ALTERNATIVE "ret", "", X86_FEATURE_RETPOLINE
+ FILL_RETURN_BUFFER
+#endif
+ ret
+END(fill_return_buffer)
diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h
index 39a2fb29378a..1d9f9269b5e7 100644
--- a/arch/x86/include/asm/mwait.h
+++ b/arch/x86/include/asm/mwait.h
@@ -87,6 +87,8 @@ static inline void __sti_mwait(unsigned long eax, unsigned long ecx)
:: "a" (eax), "c" (ecx));
}
+extern __visible void fill_return_buffer(void);
+
/*
* This uses new MONITOR/MWAIT instructions on P4 processors with PNI,
* which can obviate IPI to trigger checking of need_resched.
@@ -107,8 +109,15 @@ static inline void mwait_idle_with_hints(unsigned long eax, unsigned long ecx)
}
__monitor((void *)¤t_thread_info()->flags, 0, 0);
- if (!need_resched())
+ if (!need_resched()) {
__mwait(eax, ecx);
+ /*
+ * idle could have cleared the return buffer,
+ * so fill it to prevent uncontrolled
+ * speculation.
+ */
+ fill_return_buffer();
+ }
}
current_clr_polling();
}
--
2.14.3
next reply other threads:[~2018-01-08 23:51 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-08 23:51 Andi Kleen [this message]
2018-01-09 0:00 ` [PATCH] x86/retpoline: Also fill return buffer after idle David Woodhouse
2018-01-09 0:24 ` Andi Kleen
2018-01-09 0:28 ` David Woodhouse
2018-01-09 9:37 ` Peter Zijlstra
2018-01-09 13:58 ` David Woodhouse
2018-01-09 14:12 ` 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=20180108235126.28736-1-andi@firstfloor.org \
--to=andi@firstfloor.org \
--cc=ak@linux.intel.com \
--cc=dave.hansen@intel.com \
--cc=dwmw2@infradead.org \
--cc=gregkh@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=peterz@infradead.org \
--cc=pjt@google.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