| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Thu, 16 Dec 2010 14:25:18 +0100 |
| Subject: 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(-) |
| |
| --- a/arch/x86/include/asm/stackprotector.h |
| +++ b/arch/x86/include/asm/stackprotector.h |
| @@ -59,7 +59,7 @@ |
| */ |
| static __always_inline void boot_init_stack_canary(void) |
| { |
| - u64 canary; |
| + u64 uninitialized_var(canary); |
| u64 tsc; |
| |
| #ifdef CONFIG_X86_64 |
| @@ -70,8 +70,15 @@ static __always_inline void boot_init_st |
| * 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); |
| |