Commit 0c21fd6e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'random_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/random

Pull /dev/random updates from Ted Ts'o:
 "A few random (cough, cough) cleanups for the /dev/random driver"

* tag 'random_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/random:
  drivers/char/random.c: remove unused dont_count_entropy
  random: optimize add_interrupt_randomness
  random: always fill buffer in get_random_bytes_wait
  random: use a tighter cap in credit_entropy_bits_safe()
parents 3e968c9f 5e747dd9
...@@ -709,7 +709,8 @@ static void credit_entropy_bits(struct entropy_store *r, int nbits) ...@@ -709,7 +709,8 @@ static void credit_entropy_bits(struct entropy_store *r, int nbits)
} }
/* should we wake readers? */ /* should we wake readers? */
if (entropy_bits >= random_read_wakeup_bits) { if (entropy_bits >= random_read_wakeup_bits &&
wq_has_sleeper(&random_read_wait)) {
wake_up_interruptible(&random_read_wait); wake_up_interruptible(&random_read_wait);
kill_fasync(&fasync, SIGIO, POLL_IN); kill_fasync(&fasync, SIGIO, POLL_IN);
} }
...@@ -732,7 +733,7 @@ static void credit_entropy_bits(struct entropy_store *r, int nbits) ...@@ -732,7 +733,7 @@ static void credit_entropy_bits(struct entropy_store *r, int nbits)
static int credit_entropy_bits_safe(struct entropy_store *r, int nbits) static int credit_entropy_bits_safe(struct entropy_store *r, int nbits)
{ {
const int nbits_max = (int)(~0U >> (ENTROPY_SHIFT + 1)); const int nbits_max = r->poolinfo->poolwords * 32;
if (nbits < 0) if (nbits < 0)
return -EINVAL; return -EINVAL;
...@@ -963,7 +964,6 @@ static ssize_t extract_crng_user(void __user *buf, size_t nbytes) ...@@ -963,7 +964,6 @@ static ssize_t extract_crng_user(void __user *buf, size_t nbytes)
struct timer_rand_state { struct timer_rand_state {
cycles_t last_time; cycles_t last_time;
long last_delta, last_delta2; long last_delta, last_delta2;
unsigned dont_count_entropy:1;
}; };
#define INIT_TIMER_RAND_STATE { INITIAL_JIFFIES, }; #define INIT_TIMER_RAND_STATE { INITIAL_JIFFIES, };
...@@ -1029,35 +1029,33 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num) ...@@ -1029,35 +1029,33 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
* We take into account the first, second and third-order deltas * We take into account the first, second and third-order deltas
* in order to make our estimate. * in order to make our estimate.
*/ */
delta = sample.jiffies - state->last_time;
state->last_time = sample.jiffies;
delta2 = delta - state->last_delta;
state->last_delta = delta;
delta3 = delta2 - state->last_delta2;
state->last_delta2 = delta2;
if (delta < 0)
delta = -delta;
if (delta2 < 0)
delta2 = -delta2;
if (delta3 < 0)
delta3 = -delta3;
if (delta > delta2)
delta = delta2;
if (delta > delta3)
delta = delta3;
if (!state->dont_count_entropy) { /*
delta = sample.jiffies - state->last_time; * delta is now minimum absolute delta.
state->last_time = sample.jiffies; * Round down by 1 bit on general principles,
* and limit entropy entimate to 12 bits.
delta2 = delta - state->last_delta; */
state->last_delta = delta; credit_entropy_bits(r, min_t(int, fls(delta>>1), 11));
delta3 = delta2 - state->last_delta2;
state->last_delta2 = delta2;
if (delta < 0)
delta = -delta;
if (delta2 < 0)
delta2 = -delta2;
if (delta3 < 0)
delta3 = -delta3;
if (delta > delta2)
delta = delta2;
if (delta > delta3)
delta = delta3;
/*
* delta is now minimum absolute delta.
* Round down by 1 bit on general principles,
* and limit entropy entimate to 12 bits.
*/
credit_entropy_bits(r, min_t(int, fls(delta>>1), 11));
}
preempt_enable(); preempt_enable();
} }
......
...@@ -85,10 +85,8 @@ static inline unsigned long get_random_canary(void) ...@@ -85,10 +85,8 @@ static inline unsigned long get_random_canary(void)
static inline int get_random_bytes_wait(void *buf, int nbytes) static inline int get_random_bytes_wait(void *buf, int nbytes)
{ {
int ret = wait_for_random_bytes(); int ret = wait_for_random_bytes();
if (unlikely(ret))
return ret;
get_random_bytes(buf, nbytes); get_random_bytes(buf, nbytes);
return 0; return ret;
} }
#define declare_get_random_var_wait(var) \ #define declare_get_random_var_wait(var) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment