svn commit: r273958 - head/sys/dev/random
Xin Li
delphij at delphij.net
Sun Nov 2 21:48:15 UTC 2014
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Another revision to make Jilles happy -- changed 'block' to 'randrd'
and 'randwr', I saw his email but forgot to make the change.
Cheers,
- --
Xin LI <delphij at delphij.net> https://www.delphij.net/
FreeBSD - The Power to Serve! Live free or die
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0
iQIcBAEBCgAGBQJUVqacAAoJEJW2GBstM+nsi2cQAKGiKs+VvTNyTnG3HEYOql3s
H08TEloDczU7QyX2UMR/4MtgGTBOjLZ4xCLqvaFqJkHsxjWevW0V4XMryqrwn4B8
zLA68CJb5WsUWtUlVgrMiJnZCYI5SMYzxiUwLQdOc1aBrsEJKKvVxd0DqlF5NoEC
K4BhYvACh7tPRi5zDuCa2fjZYV5/Dgw5E46AehuD42JH+dsh4yP5tx6EZhISfig5
maT0rkgDsk8ZAHuf2pESiOvHHudxiiDrRmlNEz24lcgj/JkX4WvtAG+GaAJDwRRp
BUgkEWM8FnODFEn2ei4nYzaMqQ62XKzjU6nrzXBBY4/Y2BCAoKsDgYn9vALpwlPq
YJxrvMKqeCZiJ9iEHY+4e48FXsj7juaky4QhoJxKA1D3iOvZ7Krkh2cKywfF5Ei4
UNtFgTS/y1m7ATD7GWIXjCyZI8eb9LWPh3hYp7DTh826uR2UWGtucbkZX1rMvD3w
lCZcI5PRTSy4B+1jDXEZURkd2JZxDkOlNBQSyTZSiCLLNCVGNFjrMaFuPOLfygiM
CRnZptgOsfZO7q4lYj0eafB6VVBeJKVE7ZUodkGNxtSYS5p06a4TIFalWiM6FH4D
cwi8lnB11LipDDeNxRz7CtX+tFxugStQadZIdxKBam4edwM5ddoCnT7JjKtdgSU8
7B1Hr3lnLAtz525XLsed
=POhM
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: sys/dev/random/random_adaptors.c
===================================================================
--- sys/dev/random/random_adaptors.c (revision 273982)
+++ sys/dev/random/random_adaptors.c (working copy)
@@ -171,9 +171,8 @@ random_adaptor_register(const char *name, struct r
sx_xlock(&random_adaptors_lock);
LIST_INSERT_HEAD(&random_adaptors_list, rra, rra_entries);
random_adaptor_choose();
+ KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
sx_xunlock(&random_adaptors_lock);
-
- KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
}
void
@@ -182,9 +181,9 @@ random_adaptor_deregister(const char *name)
struct random_adaptors *rra;
KASSERT(name != NULL, ("invalid input to %s", __func__));
- KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
sx_xlock(&random_adaptors_lock);
+ KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
LIST_FOREACH(rra, &random_adaptors_list, rra_entries)
if (strcmp(rra->rra_name, name) == 0) {
LIST_REMOVE(rra, rra_entries);
@@ -208,16 +207,18 @@ random_adaptor_read(struct cdev *dev __unused, str
printf("random: %s %ld\n", __func__, uio->uio_resid);
#endif
- KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
+ random_buf = malloc(PAGE_SIZE, M_ENTROPY, M_WAITOK);
sx_slock(&random_adaptors_lock);
+ KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
+
/* Let the entropy source do any pre-read setup. */
(random_adaptor->ra_read)(NULL, 0);
/* (Un)Blocking logic */
error = 0;
- while (!random_adaptor->ra_seeded()) {
+ while (!random_adaptor->ra_seeded() && error == 0) {
if (flags & O_NONBLOCK) {
error = EWOULDBLOCK;
break;
@@ -224,7 +225,10 @@ random_adaptor_read(struct cdev *dev __unused, str
}
/* Sleep instead of going into a spin-frenzy */
- tsleep(&random_adaptor, PUSER | PCATCH, "block", hz/10);
+ error = sx_sleep(&random_adaptor, &random_adaptors_lock,
+ PUSER | PCATCH, "randrd", hz/10);
+ KASSERT(random_adaptor != NULL, ("No active random adaptor in %s",
+ __func__));
/* keep tapping away at the pre-read until we seed/unblock. */
(random_adaptor->ra_read)(NULL, 0);
@@ -241,12 +245,10 @@ random_adaptor_read(struct cdev *dev __unused, str
mtx_unlock(&random_read_rate_mtx);
- if (!error) {
+ if (error == 0) {
+ nbytes = uio->uio_resid;
/* The actual read */
-
- random_buf = malloc(PAGE_SIZE, M_ENTROPY, M_WAITOK);
-
while (uio->uio_resid && !error) {
c = MIN(uio->uio_resid, PAGE_SIZE);
(random_adaptor->ra_read)(random_buf, c);
@@ -256,11 +258,15 @@ random_adaptor_read(struct cdev *dev __unused, str
/* Let the entropy source do any post-read cleanup. */
(random_adaptor->ra_read)(NULL, 1);
- free(random_buf, M_ENTROPY);
+ if (nbytes != uio->uio_resid && (error == ERESTART ||
+ error == EINTR) )
+ error = 0; /* Return partial read, not error. */
+
}
-
sx_sunlock(&random_adaptors_lock);
+ free(random_buf, M_ENTROPY);
+
return (error);
}
@@ -269,6 +275,8 @@ random_adaptor_read_rate(void)
{
int ret;
+ sx_assert(&random_adaptors_lock, SA_LOCKED);
+
KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
mtx_lock(&random_read_rate_mtx);
@@ -287,18 +295,20 @@ random_adaptor_write(struct cdev *dev __unused, st
{
int c, error = 0;
void *random_buf;
+ ssize_t nbytes;
#ifdef RANDOM_DEBUG
printf("random: %s %zd\n", __func__, uio->uio_resid);
#endif
- KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
+ random_buf = malloc(PAGE_SIZE, M_ENTROPY, M_WAITOK);
sx_slock(&random_adaptors_lock);
- random_buf = malloc(PAGE_SIZE, M_ENTROPY, M_WAITOK);
+ KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
- while (uio->uio_resid > 0) {
+ nbytes = uio->uio_resid;
+ while (uio->uio_resid > 0 && error == 0) {
c = MIN(uio->uio_resid, PAGE_SIZE);
error = uiomove(random_buf, c, uio);
if (error)
@@ -306,13 +316,20 @@ random_adaptor_write(struct cdev *dev __unused, st
(random_adaptor->ra_write)(random_buf, c);
/* Introduce an annoying delay to stop swamping */
- tsleep(&random_adaptor, PUSER | PCATCH, "block", hz/10);
+ error = sx_sleep(&random_adaptor, &random_adaptors_lock,
+ PUSER | PCATCH, "randwr", hz/10);
+ KASSERT(random_adaptor != NULL, ("No active random adaptor in %s",
+ __func__));
}
+ sx_sunlock(&random_adaptors_lock);
+
+ if (nbytes != uio->uio_resid && (error == ERESTART ||
+ error == EINTR) )
+ error = 0; /* Partial write, not error. */
+
free(random_buf, M_ENTROPY);
- sx_sunlock(&random_adaptors_lock);
-
return (error);
}
@@ -325,10 +342,10 @@ random_adaptor_poll(struct cdev *dev __unused, int
printf("random: %s\n", __func__);
#endif
+ sx_slock(&random_adaptors_lock);
+
KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
- sx_slock(&random_adaptors_lock);
-
if (events & (POLLIN | POLLRDNORM)) {
if (random_adaptor->ra_seeded())
events &= (POLLIN | POLLRDNORM);
@@ -382,9 +399,9 @@ random_sysctl_active_adaptor_handler(SYSCTL_HANDLE
struct sbuf sbuf;
int error;
+ sx_slock(&random_adaptors_lock);
KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
- sx_slock(&random_adaptors_lock);
sbuf_new_for_sysctl(&sbuf, NULL, 16, req);
LIST_FOREACH(rra, &random_adaptors_list, rra_entries)
if (rra->rra_ra == random_adaptor) {
@@ -454,9 +471,9 @@ static void
random_adaptors_seed(void *unused __unused)
{
+ sx_slock(&random_adaptors_lock);
KASSERT(random_adaptor != NULL, ("No active random adaptor in %s", __func__));
- sx_slock(&random_adaptors_lock);
random_adaptor->ra_reseed();
sx_sunlock(&random_adaptors_lock);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: random-tsleep.diff.sig
Type: application/octet-stream
Size: 543 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/svn-src-all/attachments/20141102/9d85328b/attachment.obj>
More information about the svn-src-all
mailing list