mirror of https://gitee.com/openkylin/linux.git
A few random (cough, cough) cleanups for the /dev/random driver
-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEK2m5VNv+CHkogTfJ8vlZVpUNgaMFAlrE0xEACgkQ8vlZVpUN gaP0Egf+NTu/CqNiaP4zXkHprYywnOYrh+NS46H5ZxFRzVox1ctiGeRfGWWrRU8+ 9SIqKhMxagHU1OU71+aNrJ5bqBcTsebY/AQ8PrS6/YxJMTKTNYD8oT4uhkfV3ZE7 76WcTlyuDv+CCISUlXYXk/3H+8nP46GGaW3O51ET4SZxboMKnmSlTiKxRmBBiiib +zuBAhReXaLSN6u0HjlTkz8UXGj0uQurMq9jOanIjZmap2iChlA0kANl2prgLvoY KFL2XLv3sctSTlCw+xeeQUW4YGTRMAanoZDO8G5WVTA2k4ztgcqHamaCewpx6P/o xzPpfysIGi6WINNQoEb88brxEk0VIw== =slEq -----END PGP SIGNATURE----- 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()
This commit is contained in:
commit
0c21fd6e65
|
@ -709,7 +709,8 @@ static void credit_entropy_bits(struct entropy_store *r, int nbits)
|
|||
}
|
||||
|
||||
/* 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);
|
||||
kill_fasync(&fasync, SIGIO, POLL_IN);
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
const int nbits_max = (int)(~0U >> (ENTROPY_SHIFT + 1));
|
||||
const int nbits_max = r->poolinfo->poolwords * 32;
|
||||
|
||||
if (nbits < 0)
|
||||
return -EINVAL;
|
||||
|
@ -963,7 +964,6 @@ static ssize_t extract_crng_user(void __user *buf, size_t nbytes)
|
|||
struct timer_rand_state {
|
||||
cycles_t last_time;
|
||||
long last_delta, last_delta2;
|
||||
unsigned dont_count_entropy:1;
|
||||
};
|
||||
|
||||
#define INIT_TIMER_RAND_STATE { INITIAL_JIFFIES, };
|
||||
|
@ -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
|
||||
* in order to make our estimate.
|
||||
*/
|
||||
delta = sample.jiffies - state->last_time;
|
||||
state->last_time = sample.jiffies;
|
||||
|
||||
if (!state->dont_count_entropy) {
|
||||
delta = sample.jiffies - state->last_time;
|
||||
state->last_time = sample.jiffies;
|
||||
delta2 = delta - state->last_delta;
|
||||
state->last_delta = delta;
|
||||
|
||||
delta2 = delta - state->last_delta;
|
||||
state->last_delta = delta;
|
||||
delta3 = delta2 - state->last_delta2;
|
||||
state->last_delta2 = delta2;
|
||||
|
||||
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 (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));
|
||||
|
||||
/*
|
||||
* 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();
|
||||
}
|
||||
|
||||
|
|
|
@ -85,10 +85,8 @@ static inline unsigned long get_random_canary(void)
|
|||
static inline int get_random_bytes_wait(void *buf, int nbytes)
|
||||
{
|
||||
int ret = wait_for_random_bytes();
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
get_random_bytes(buf, nbytes);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define declare_get_random_var_wait(var) \
|
||||
|
|
Loading…
Reference in New Issue