summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/mem.c
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1999-02-02 14:14:05 +0000
committerbde <bde@FreeBSD.org>1999-02-02 14:14:05 +0000
commit78b0de3bf4da3d2f06a3acb35097a2b381f9e01c (patch)
treecf27bc2feeb131d283f8b7d07405ccc6394add1d /sys/amd64/amd64/mem.c
parent0fd52730c216aa70c9761b100b73f0ec0ffab6ea (diff)
downloadFreeBSD-src-78b0de3bf4da3d2f06a3acb35097a2b381f9e01c.zip
FreeBSD-src-78b0de3bf4da3d2f06a3acb35097a2b381f9e01c.tar.gz
Check for signals while reading /dev/urandom. Reading 10MB from
/dev/urandom takes about 38 seconds on a P5/133. It is useful to be able to kill such reads almost immediately. Processes doing such reads are now scheduled so their denial of service is no worse than that of processes looping in user mode.
Diffstat (limited to 'sys/amd64/amd64/mem.c')
-rw-r--r--sys/amd64/amd64/mem.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sys/amd64/amd64/mem.c b/sys/amd64/amd64/mem.c
index 1994f12..725eaa1 100644
--- a/sys/amd64/amd64/mem.c
+++ b/sys/amd64/amd64/mem.c
@@ -38,7 +38,7 @@
*
* from: Utah $Hdr: mem.c 1.13 89/10/08$
* from: @(#)mem.c 7.2 (Berkeley) 5/9/91
- * $Id: mem.c,v 1.52 1998/06/21 11:33:29 bde Exp $
+ * $Id: mem.c,v 1.53 1998/11/08 12:39:01 dfr Exp $
*/
/*
@@ -59,6 +59,7 @@
#include <sys/uio.h>
#include <sys/malloc.h>
#include <sys/proc.h>
+#include <sys/signalvar.h>
#include <machine/frame.h>
#include <machine/random.h>
@@ -287,6 +288,16 @@ mmrw(dev, uio, flags)
c = iov->iov_len;
break;
}
+ if (CURSIG(curproc) != 0) {
+ /*
+ * Use tsleep() to get the error code right.
+ * It should return immediately.
+ */
+ error = tsleep(&random_softc[0],
+ PZERO | PCATCH, "urand", 1);
+ if (error != 0 && error != EWOULDBLOCK)
+ continue;
+ }
if (buf == NULL)
buf = (caddr_t)
malloc(PAGE_SIZE, M_TEMP, M_WAITOK);
OpenPOWER on IntegriCloud