|
@@ -910,12 +910,13 @@ void add_interrupt_randomness(int irq, int irq_flags)
|
|
|
|
|
|
/*
|
|
|
* If we have architectural seed generator, produce a seed and
|
|
|
- * add it to the pool. For the sake of paranoia count it as
|
|
|
- * 50% entropic.
|
|
|
+ * add it to the pool. For the sake of paranoia don't let the
|
|
|
+ * architectural seed generator dominate the input from the
|
|
|
+ * interrupt noise.
|
|
|
*/
|
|
|
if (arch_get_random_seed_long(&seed)) {
|
|
|
__mix_pool_bytes(r, &seed, sizeof(seed));
|
|
|
- credit += sizeof(seed) * 4;
|
|
|
+ credit = 1;
|
|
|
}
|
|
|
spin_unlock(&r->lock);
|
|
|
|
|
@@ -1328,37 +1329,6 @@ void rand_initialize_disk(struct gendisk *disk)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-/*
|
|
|
- * Attempt an emergency refill using arch_get_random_seed_long().
|
|
|
- *
|
|
|
- * As with add_interrupt_randomness() be paranoid and only
|
|
|
- * credit the output as 50% entropic.
|
|
|
- */
|
|
|
-static int arch_random_refill(void)
|
|
|
-{
|
|
|
- const unsigned int nlongs = 64; /* Arbitrary number */
|
|
|
- unsigned int n = 0;
|
|
|
- unsigned int i;
|
|
|
- unsigned long buf[nlongs];
|
|
|
-
|
|
|
- if (!arch_has_random_seed())
|
|
|
- return 0;
|
|
|
-
|
|
|
- for (i = 0; i < nlongs; i++) {
|
|
|
- if (arch_get_random_seed_long(&buf[n]))
|
|
|
- n++;
|
|
|
- }
|
|
|
-
|
|
|
- if (n) {
|
|
|
- unsigned int rand_bytes = n * sizeof(unsigned long);
|
|
|
-
|
|
|
- mix_pool_bytes(&input_pool, buf, rand_bytes);
|
|
|
- credit_entropy_bits(&input_pool, rand_bytes*4);
|
|
|
- }
|
|
|
-
|
|
|
- return n;
|
|
|
-}
|
|
|
-
|
|
|
static ssize_t
|
|
|
_random_read(int nonblock, char __user *buf, size_t nbytes)
|
|
|
{
|
|
@@ -1379,11 +1349,6 @@ _random_read(int nonblock, char __user *buf, size_t nbytes)
|
|
|
return n;
|
|
|
|
|
|
/* Pool is (near) empty. Maybe wait and retry. */
|
|
|
-
|
|
|
- /* First try an emergency refill */
|
|
|
- if (arch_random_refill())
|
|
|
- continue;
|
|
|
-
|
|
|
if (nonblock)
|
|
|
return -EAGAIN;
|
|
|
|