52 lines
1.9 KiB
Diff
52 lines
1.9 KiB
Diff
|
From 47fb1f1e6e64d2d6f1c313c5096f6b0a0da19011 Mon Sep 17 00:00:00 2001
|
||
|
From: Thomas Gleixner <tglx@linutronix.de>
|
||
|
Date: Thu, 16 Dec 2010 14:25:18 +0100
|
||
|
Subject: [PATCH 205/365] x86: stackprotector: Avoid random pool on rt
|
||
|
|
||
|
CPU bringup calls into the random pool to initialize the stack
|
||
|
canary. During boot that works nicely even on RT as the might sleep
|
||
|
checks are disabled. During CPU hotplug the might sleep checks
|
||
|
trigger. Making the locks in random raw is a major PITA, so avoid the
|
||
|
call on RT is the only sensible solution. This is basically the same
|
||
|
randomness which we get during boot where the random pool has no
|
||
|
entropy and we rely on the TSC randomnness.
|
||
|
|
||
|
Reported-by: Carsten Emde <carsten.emde@osadl.org>
|
||
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||
|
---
|
||
|
arch/x86/include/asm/stackprotector.h | 9 ++++++++-
|
||
|
1 file changed, 8 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h
|
||
|
index 743bd2d77e51..e1fabfcddd65 100644
|
||
|
--- a/arch/x86/include/asm/stackprotector.h
|
||
|
+++ b/arch/x86/include/asm/stackprotector.h
|
||
|
@@ -64,7 +64,7 @@
|
||
|
*/
|
||
|
static __always_inline void boot_init_stack_canary(void)
|
||
|
{
|
||
|
- u64 canary;
|
||
|
+ u64 uninitialized_var(canary);
|
||
|
u64 tsc;
|
||
|
|
||
|
#ifdef CONFIG_X86_64
|
||
|
@@ -75,8 +75,15 @@ static __always_inline void boot_init_stack_canary(void)
|
||
|
* of randomness. The TSC only matters for very early init,
|
||
|
* there it already has some randomness on most systems. Later
|
||
|
* on during the bootup the random pool has true entropy too.
|
||
|
+ *
|
||
|
+ * For preempt-rt we need to weaken the randomness a bit, as
|
||
|
+ * we can't call into the random generator from atomic context
|
||
|
+ * due to locking constraints. We just leave canary
|
||
|
+ * uninitialized and use the TSC based randomness on top of it.
|
||
|
*/
|
||
|
+#ifndef CONFIG_PREEMPT_RT_FULL
|
||
|
get_random_bytes(&canary, sizeof(canary));
|
||
|
+#endif
|
||
|
tsc = rdtsc();
|
||
|
canary += tsc + (tsc << 32UL);
|
||
|
|
||
|
--
|
||
|
2.28.0
|
||
|
|