aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/random.c30
1 files changed, 7 insertions, 23 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 482531d87fb8..92d6dd24c86e 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -466,7 +466,6 @@ struct entropy_store {
466 int entropy_count; 466 int entropy_count;
467 int entropy_total; 467 int entropy_total;
468 unsigned int initialized:1; 468 unsigned int initialized:1;
469 unsigned int limit:1;
470 unsigned int last_data_init:1; 469 unsigned int last_data_init:1;
471 __u8 last_data[EXTRACT_SIZE]; 470 __u8 last_data[EXTRACT_SIZE];
472}; 471};
@@ -484,7 +483,6 @@ static __u32 blocking_pool_data[OUTPUT_POOL_WORDS] __latent_entropy;
484static struct entropy_store input_pool = { 483static struct entropy_store input_pool = {
485 .poolinfo = &poolinfo_table[0], 484 .poolinfo = &poolinfo_table[0],
486 .name = "input", 485 .name = "input",
487 .limit = 1,
488 .lock = __SPIN_LOCK_UNLOCKED(input_pool.lock), 486 .lock = __SPIN_LOCK_UNLOCKED(input_pool.lock),
489 .pool = input_pool_data 487 .pool = input_pool_data
490}; 488};
@@ -492,7 +490,6 @@ static struct entropy_store input_pool = {
492static struct entropy_store blocking_pool = { 490static struct entropy_store blocking_pool = {
493 .poolinfo = &poolinfo_table[1], 491 .poolinfo = &poolinfo_table[1],
494 .name = "blocking", 492 .name = "blocking",
495 .limit = 1,
496 .pull = &input_pool, 493 .pull = &input_pool,
497 .lock = __SPIN_LOCK_UNLOCKED(blocking_pool.lock), 494 .lock = __SPIN_LOCK_UNLOCKED(blocking_pool.lock),
498 .pool = blocking_pool_data, 495 .pool = blocking_pool_data,
@@ -1212,15 +1209,6 @@ static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
1212 r->entropy_count > r->poolinfo->poolfracbits) 1209 r->entropy_count > r->poolinfo->poolfracbits)
1213 return; 1210 return;
1214 1211
1215 if (r->limit == 0 && random_min_urandom_seed) {
1216 unsigned long now = jiffies;
1217
1218 if (time_before(now,
1219 r->last_pulled + random_min_urandom_seed * HZ))
1220 return;
1221 r->last_pulled = now;
1222 }
1223
1224 _xfer_secondary_pool(r, nbytes); 1212 _xfer_secondary_pool(r, nbytes);
1225} 1213}
1226 1214
@@ -1228,8 +1216,6 @@ static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
1228{ 1216{
1229 __u32 tmp[OUTPUT_POOL_WORDS]; 1217 __u32 tmp[OUTPUT_POOL_WORDS];
1230 1218
1231 /* For /dev/random's pool, always leave two wakeups' worth */
1232 int rsvd_bytes = r->limit ? 0 : random_read_wakeup_bits / 4;
1233 int bytes = nbytes; 1219 int bytes = nbytes;
1234 1220
1235 /* pull at least as much as a wakeup */ 1221 /* pull at least as much as a wakeup */
@@ -1240,7 +1226,7 @@ static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
1240 trace_xfer_secondary_pool(r->name, bytes * 8, nbytes * 8, 1226 trace_xfer_secondary_pool(r->name, bytes * 8, nbytes * 8,
1241 ENTROPY_BITS(r), ENTROPY_BITS(r->pull)); 1227 ENTROPY_BITS(r), ENTROPY_BITS(r->pull));
1242 bytes = extract_entropy(r->pull, tmp, bytes, 1228 bytes = extract_entropy(r->pull, tmp, bytes,
1243 random_read_wakeup_bits / 8, rsvd_bytes); 1229 random_read_wakeup_bits / 8, 0);
1244 mix_pool_bytes(r, tmp, bytes); 1230 mix_pool_bytes(r, tmp, bytes);
1245 credit_entropy_bits(r, bytes*8); 1231 credit_entropy_bits(r, bytes*8);
1246} 1232}
@@ -1268,7 +1254,7 @@ static void push_to_pool(struct work_struct *work)
1268static size_t account(struct entropy_store *r, size_t nbytes, int min, 1254static size_t account(struct entropy_store *r, size_t nbytes, int min,
1269 int reserved) 1255 int reserved)
1270{ 1256{
1271 int entropy_count, orig; 1257 int entropy_count, orig, have_bytes;
1272 size_t ibytes, nfrac; 1258 size_t ibytes, nfrac;
1273 1259
1274 BUG_ON(r->entropy_count > r->poolinfo->poolfracbits); 1260 BUG_ON(r->entropy_count > r->poolinfo->poolfracbits);
@@ -1277,14 +1263,12 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,
1277retry: 1263retry:
1278 entropy_count = orig = ACCESS_ONCE(r->entropy_count); 1264 entropy_count = orig = ACCESS_ONCE(r->entropy_count);
1279 ibytes = nbytes; 1265 ibytes = nbytes;
1280 /* If limited, never pull more than available */ 1266 /* never pull more than available */
1281 if (r->limit) { 1267 have_bytes = entropy_count >> (ENTROPY_SHIFT + 3);
1282 int have_bytes = entropy_count >> (ENTROPY_SHIFT + 3);
1283 1268
1284 if ((have_bytes -= reserved) < 0) 1269 if ((have_bytes -= reserved) < 0)
1285 have_bytes = 0; 1270 have_bytes = 0;
1286 ibytes = min_t(size_t, ibytes, have_bytes); 1271 ibytes = min_t(size_t, ibytes, have_bytes);
1287 }
1288 if (ibytes < min) 1272 if (ibytes < min)
1289 ibytes = 0; 1273 ibytes = 0;
1290 1274