diff options
author | markm <markm@FreeBSD.org> | 2015-07-19 16:05:30 +0000 |
---|---|---|
committer | markm <markm@FreeBSD.org> | 2015-07-19 16:05:30 +0000 |
commit | bf2adab7ba33ad4373260041cae28963cca0b92c (patch) | |
tree | c3e8922672e364343aab34ca31650c63db25d107 /sys/dev/random/randomdev.c | |
parent | 4c0e7b570614839e7d2ea28c2b951b767ef8e2dd (diff) | |
download | FreeBSD-src-bf2adab7ba33ad4373260041cae28963cca0b92c.zip FreeBSD-src-bf2adab7ba33ad4373260041cae28963cca0b92c.tar.gz |
Fix the read blocking so that it is interruptable and slow down the rate of console warning spamming while blocked.
Approved by: so (/dev/random blanket)
Diffstat (limited to 'sys/dev/random/randomdev.c')
-rw-r--r-- | sys/dev/random/randomdev.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/dev/random/randomdev.c b/sys/dev/random/randomdev.c index 8a12777..22f8da5 100644 --- a/sys/dev/random/randomdev.c +++ b/sys/dev/random/randomdev.c @@ -163,22 +163,28 @@ int read_random_uio(struct uio *uio, bool nonblock) { uint8_t *random_buf; - int error; + int error, spamcount; ssize_t read_len, total_read, c; random_buf = malloc(PAGE_SIZE, M_ENTROPY, M_WAITOK); random_alg_context.ra_pre_read(); - /* (Un)Blocking logic */ error = 0; + spamcount = 0; + /* (Un)Blocking logic */ while (!random_alg_context.ra_seeded()) { if (nonblock) { error = EWOULDBLOCK; break; } - tsleep(&random_alg_context, 0, "randseed", hz/10); /* keep tapping away at the pre-read until we seed/unblock. */ random_alg_context.ra_pre_read(); - printf("random: %s unblock wait\n", __func__); + /* Only bother the console every 10 seconds or so */ + if (spamcount == 0) + printf("random: %s unblock wait\n", __func__); + spamcount = (spamcount + 1)%100; + error = tsleep(&random_alg_context, PCATCH, "randseed", hz/10); + if ((error == ERESTART | error == EINTR)) + break; } if (error == 0) { #if !defined(RANDOM_DUMMY) |