Messages in this thread Patch in this message | | | From | Sebastian Andrzej Siewior <> | Subject | [PATCH 3/5] random: Split add_interrupt_randomness(). | Date | Tue, 7 Dec 2021 13:17:35 +0100 |
| |
Split add_interrupt_randomness() into two parts: - add_interrupt_randomness() which collects the entropy on the invocation of a hardware interrupt and it feeds into the fast_pool, a per-CPU variable (irq_randomness).
- process_interrupt_randomness_pool() which feeds the fast_pool/ irq_randomness into the entropy_store if enough entropy has been gathered.
This is a preparations step to ease PREEMPT_RT support.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- drivers/char/random.c | 47 +++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 20 deletions(-)
diff --git a/drivers/char/random.c b/drivers/char/random.c index c8067c264a880..dfc38d87125f5 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -1242,29 +1242,10 @@ static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs) return *ptr; } -void add_interrupt_randomness(int irq) +static void process_interrupt_randomness_pool(struct fast_pool *fast_pool) { struct entropy_store *r; - struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness); - struct pt_regs *regs = get_irq_regs(); unsigned long now = jiffies; - cycles_t cycles = random_get_entropy(); - __u32 c_high, j_high; - __u64 ip; - - if (cycles == 0) - cycles = get_reg(fast_pool, regs); - c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0; - j_high = (sizeof(now) > 4) ? now >> 32 : 0; - fast_pool->pool[0] ^= cycles ^ j_high ^ irq; - fast_pool->pool[1] ^= now ^ c_high; - ip = regs ? instruction_pointer(regs) : _RET_IP_; - fast_pool->pool[2] ^= ip; - fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 : - get_reg(fast_pool, regs); - - fast_mix(fast_pool); - add_interrupt_bench(cycles); if (unlikely(crng_init == 0)) { if ((fast_pool->count >= 64) && @@ -1293,6 +1274,32 @@ void add_interrupt_randomness(int irq) /* award one bit for the contents of the fast pool */ credit_entropy_bits(r, 1); } + +void add_interrupt_randomness(int irq) +{ + struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness); + struct pt_regs *regs = get_irq_regs(); + unsigned long now = jiffies; + cycles_t cycles = random_get_entropy(); + __u32 c_high, j_high; + __u64 ip; + + if (cycles == 0) + cycles = get_reg(fast_pool, regs); + c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0; + j_high = (sizeof(now) > 4) ? now >> 32 : 0; + fast_pool->pool[0] ^= cycles ^ j_high ^ irq; + fast_pool->pool[1] ^= now ^ c_high; + ip = regs ? instruction_pointer(regs) : _RET_IP_; + fast_pool->pool[2] ^= ip; + fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 : + get_reg(fast_pool, regs); + + fast_mix(fast_pool); + add_interrupt_bench(cycles); + + process_interrupt_randomness_pool(fast_pool); +} EXPORT_SYMBOL_GPL(add_interrupt_randomness); #ifdef CONFIG_BLOCK -- 2.34.1
| |