diff options
author | Theodore Ts'o <tytso@mit.edu> | 2013-10-02 21:10:35 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-10-10 14:32:21 -0400 |
commit | 95b709b6be49e4ff3933ef6a5b5e623de2713a71 (patch) | |
tree | 29d560bdef37bafaf732900ec3f14380e4ec0d70 /drivers/char/random.c | |
parent | 6e9fa2c8a630e6d0882828012431038abce285b9 (diff) |
random: drop trickle mode
The add_timer_randomness() used to drop into trickle mode when entropy
pool was estimated to be 87.5% full. This was important when
add_timer_randomness() was used to sample interrupts. It's not used
for this any more --- add_interrupt_randomness() now uses fast_mix()
instead. By elimitating trickle mode, it allows us to fully utilize
entropy provided by add_input_randomness() and add_disk_randomness()
even when the input pool is above the old trickle threshold of 87.5%.
This helps to answer the criticism in [1] in their hypothetical
scenario where our entropy estimator was inaccurate, even though the
measurements in [2] seem to indicate that our entropy estimator given
real-life entropy collection is actually pretty good, albeit on the
conservative side (which was as it was designed).
[1] http://eprint.iacr.org/2013/338.pdf
[2] http://eprint.iacr.org/2012/251.pdf
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'drivers/char/random.c')
-rw-r--r-- | drivers/char/random.c | 19 |
1 files changed, 2 insertions, 17 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c index 7ae7ea65da68..6da3f250804c 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -282,10 +282,8 @@ | |||
282 | #define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long)) | 282 | #define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long)) |
283 | 283 | ||
284 | /* | 284 | /* |
285 | * To allow fractional bits to be tracked, the following fields contain | 285 | * To allow fractional bits to be tracked, the entropy_count field is |
286 | * this many fractional bits: | 286 | * denominated in units of 1/8th bits. |
287 | * | ||
288 | * entropy_count, trickle_thresh | ||
289 | * | 287 | * |
290 | * 2*(ENTROPY_SHIFT + log2(poolbits)) must <= 31, or the multiply in | 288 | * 2*(ENTROPY_SHIFT + log2(poolbits)) must <= 31, or the multiply in |
291 | * credit_entropy_bits() needs to be 64 bits wide. | 289 | * credit_entropy_bits() needs to be 64 bits wide. |
@@ -314,14 +312,6 @@ static int random_write_wakeup_thresh = 128; | |||
314 | static int random_min_urandom_seed = 60; | 312 | static int random_min_urandom_seed = 60; |
315 | 313 | ||
316 | /* | 314 | /* |
317 | * When the input pool goes over trickle_thresh, start dropping most | ||
318 | * samples to avoid wasting CPU time and reduce lock contention. | ||
319 | */ | ||
320 | static const int trickle_thresh = (INPUT_POOL_WORDS * 28) << ENTROPY_SHIFT; | ||
321 | |||
322 | static DEFINE_PER_CPU(int, trickle_count); | ||
323 | |||
324 | /* | ||
325 | * Originally, we used a primitive polynomial of degree .poolwords | 315 | * Originally, we used a primitive polynomial of degree .poolwords |
326 | * over GF(2). The taps for various sizes are defined below. They | 316 | * over GF(2). The taps for various sizes are defined below. They |
327 | * were chosen to be evenly spaced except for the last tap, which is 1 | 317 | * were chosen to be evenly spaced except for the last tap, which is 1 |
@@ -755,10 +745,6 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num) | |||
755 | long delta, delta2, delta3; | 745 | long delta, delta2, delta3; |
756 | 746 | ||
757 | preempt_disable(); | 747 | preempt_disable(); |
758 | /* if over the trickle threshold, use only 1 in 4096 samples */ | ||
759 | if (ENTROPY_BITS(&input_pool) > trickle_thresh && | ||
760 | ((__this_cpu_inc_return(trickle_count) - 1) & 0xfff)) | ||
761 | goto out; | ||
762 | 748 | ||
763 | sample.jiffies = jiffies; | 749 | sample.jiffies = jiffies; |
764 | sample.cycles = random_get_entropy(); | 750 | sample.cycles = random_get_entropy(); |
@@ -800,7 +786,6 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num) | |||
800 | credit_entropy_bits(&input_pool, | 786 | credit_entropy_bits(&input_pool, |
801 | min_t(int, fls(delta>>1), 11)); | 787 | min_t(int, fls(delta>>1), 11)); |
802 | } | 788 | } |
803 | out: | ||
804 | preempt_enable(); | 789 | preempt_enable(); |
805 | } | 790 | } |
806 | 791 | ||