random: optimize spinlock use in add_device_randomness()
The add_device_randomness() function calls mix_pool_bytes() twice for the input pool and the non-blocking pool, for a total of four times. By using _mix_pool_byte() and taking the spinlock in add_device_randomness(), we can halve the number of times we need take each pool's spinlock. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
5910895f0e
commit
3ef4cb2d65
|
@ -710,12 +710,18 @@ struct timer_rand_state {
|
|||
void add_device_randomness(const void *buf, unsigned int size)
|
||||
{
|
||||
unsigned long time = random_get_entropy() ^ jiffies;
|
||||
unsigned long flags;
|
||||
|
||||
trace_add_device_randomness(size, _RET_IP_);
|
||||
mix_pool_bytes(&input_pool, buf, size, NULL);
|
||||
mix_pool_bytes(&input_pool, &time, sizeof(time), NULL);
|
||||
mix_pool_bytes(&nonblocking_pool, buf, size, NULL);
|
||||
mix_pool_bytes(&nonblocking_pool, &time, sizeof(time), NULL);
|
||||
spin_lock_irqsave(&input_pool.lock, flags);
|
||||
_mix_pool_bytes(&input_pool, buf, size, NULL);
|
||||
_mix_pool_bytes(&input_pool, &time, sizeof(time), NULL);
|
||||
spin_unlock_irqrestore(&input_pool.lock, flags);
|
||||
|
||||
spin_lock_irqsave(&nonblocking_pool.lock, flags);
|
||||
_mix_pool_bytes(&nonblocking_pool, buf, size, NULL);
|
||||
_mix_pool_bytes(&nonblocking_pool, &time, sizeof(time), NULL);
|
||||
spin_unlock_irqrestore(&nonblocking_pool.lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(add_device_randomness);
|
||||
|
||||
|
|
Loading…
Reference in New Issue