a5cefb298d95257ff3e5bd6746ce13d251f023b8
[openwrt/staging/ldir.git] /
1 From c577ded541087c1d21a6904020670fd59c218e04 Mon Sep 17 00:00:00 2001
2 From: "Jason A. Donenfeld" <Jason@zx2c4.com>
3 Date: Tue, 7 Jun 2022 12:02:10 +0200
4 Subject: [PATCH] random: do not use jump labels before they are
5 initialized
6
7 [ I would like to pursue fixing this more directly first before actually
8 merging this, but I thought I'd send this to the list now anyway as a
9 the "backup" plan. If I can't figure out how to make headway on the
10 main plan in the next few days, it'll be easy to just do this. ]
11
12 Stephen reported that a static key warning splat appears during early
13 boot on systems that credit randomness from device trees that contain an
14 "rng-seed" property, because because setup_machine_fdt() is called
15 before jump_label_init() during setup_arch():
16
17 static_key_enable_cpuslocked(): static key '0xffffffe51c6fcfc0' used before call to jump_label_init()
18 WARNING: CPU: 0 PID: 0 at kernel/jump_label.c:166 static_key_enable_cpuslocked+0xb0/0xb8
19 Modules linked in:
20 CPU: 0 PID: 0 Comm: swapper Not tainted 5.18.0+ #224 44b43e377bfc84bc99bb5ab885ff694984ee09ff
21 pstate: 600001c9 (nZCv dAIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
22 pc : static_key_enable_cpuslocked+0xb0/0xb8
23 lr : static_key_enable_cpuslocked+0xb0/0xb8
24 sp : ffffffe51c393cf0
25 x29: ffffffe51c393cf0 x28: 000000008185054c x27: 00000000f1042f10
26 x26: 0000000000000000 x25: 00000000f10302b2 x24: 0000002513200000
27 x23: 0000002513200000 x22: ffffffe51c1c9000 x21: fffffffdfdc00000
28 x20: ffffffe51c2f0831 x19: ffffffe51c6fcfc0 x18: 00000000ffff1020
29 x17: 00000000e1e2ac90 x16: 00000000000000e0 x15: ffffffe51b710708
30 x14: 0000000000000066 x13: 0000000000000018 x12: 0000000000000000
31 x11: 0000000000000000 x10: 00000000ffffffff x9 : 0000000000000000
32 x8 : 0000000000000000 x7 : 61632065726f6665 x6 : 6220646573752027
33 x5 : ffffffe51c641d25 x4 : ffffffe51c13142c x3 : ffff0a00ffffff05
34 x2 : 40000000ffffe003 x1 : 00000000000001c0 x0 : 0000000000000065
35 Call trace:
36 static_key_enable_cpuslocked+0xb0/0xb8
37 static_key_enable+0x2c/0x40
38 crng_set_ready+0x24/0x30
39 execute_in_process_context+0x80/0x90
40 _credit_init_bits+0x100/0x154
41 add_bootloader_randomness+0x64/0x78
42 early_init_dt_scan_chosen+0x140/0x184
43 early_init_dt_scan_nodes+0x28/0x4c
44 early_init_dt_scan+0x40/0x44
45 setup_machine_fdt+0x7c/0x120
46 setup_arch+0x74/0x1d8
47 start_kernel+0x84/0x44c
48 __primary_switched+0xc0/0xc8
49 ---[ end trace 0000000000000000 ]---
50 random: crng init done
51 Machine model: Google Lazor (rev1 - 2) with LTE
52
53 A trivial fix went in to address this on arm64, 73e2d827a501 ("arm64:
54 Initialize jump labels before setup_machine_fdt()"). But it appears that
55 fixing it on other platforms might not be so trivial. Instead, defer the
56 setting of the static branch until later in the boot process.
57
58 Fixes: f5bda35fba61 ("random: use static branch for crng_ready()")
59 Reported-by: Stephen Boyd <swboyd@chromium.org>
60 Cc: Ard Biesheuvel <ardb@kernel.org>
61 Cc: Catalin Marinas <catalin.marinas@arm.com>
62 Cc: Russell King <linux@armlinux.org.uk>
63 Cc: Arnd Bergmann <arnd@arndb.de>
64 Cc: Phil Elwell <phil@raspberrypi.com>
65 Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
66 ---
67 drivers/char/random.c | 8 ++++++++
68 1 file changed, 8 insertions(+)
69
70 --- a/drivers/char/random.c
71 +++ b/drivers/char/random.c
72 @@ -823,6 +823,14 @@ void __init random_init_early(const char
73 unsigned long entropy[BLAKE2S_BLOCK_SIZE / sizeof(long)];
74 size_t i, longs, arch_bits;
75
76 + /*
77 + * If we were initialized by the bootloader before jump labels are
78 + * initialized, then we should enable the static branch here, where
79 + * it's guaranteed that jump labels have been initialized.
80 + */
81 + if (!static_branch_likely(&crng_is_ready) && crng_init >= CRNG_READY)
82 + crng_set_ready(NULL);
83 +
84 #if defined(LATENT_ENTROPY_PLUGIN)
85 static const u8 compiletime_seed[BLAKE2S_BLOCK_SIZE] __initconst __latent_entropy;
86 _mix_pool_bytes(compiletime_seed, sizeof(compiletime_seed));