summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Evans <bde@FreeBSD.org>1999-02-13 09:30:56 +0000
committerBruce Evans <bde@FreeBSD.org>1999-02-13 09:30:56 +0000
commitc65fd63b69ad576ea5900646be175e7316c5127c (patch)
treec37059ce864e12222e41fdaf238eda0e2dbd4329
parentba26628572a899896a7452721aa09aff14d02648 (diff)
Notes
-rw-r--r--sys/alpha/include/cpu.h4
-rw-r--r--sys/i386/i386/mem.c13
-rw-r--r--sys/i386/include/cpu.h4
-rw-r--r--sys/kern/kern_subr.c27
4 files changed, 44 insertions, 4 deletions
diff --git a/sys/alpha/include/cpu.h b/sys/alpha/include/cpu.h
index 5a0a15acf221..e4cf206ed0db 100644
--- a/sys/alpha/include/cpu.h
+++ b/sys/alpha/include/cpu.h
@@ -1,4 +1,4 @@
-/* $Id: cpu.h,v 1.3 1998/07/12 16:32:06 dfr Exp $ */
+/* $Id: cpu.h,v 1.4 1998/10/06 08:40:17 dfr Exp $ */
/* From: NetBSD: cpu.h,v 1.18 1997/09/23 23:17:49 mjacob Exp */
/*
@@ -77,6 +77,8 @@ struct clockframe {
*/
#define need_resched() { want_resched = 1; aston(); }
+#define resched_wanted() want_resched
+
/*
* Give a profiling tick to the current process when the user profiling
* buffer pages are invalid. On the hp300, request an ast to send us
diff --git a/sys/i386/i386/mem.c b/sys/i386/i386/mem.c
index 1994f12ce538..725eaa1af117 100644
--- a/sys/i386/i386/mem.c
+++ b/sys/i386/i386/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);
diff --git a/sys/i386/include/cpu.h b/sys/i386/include/cpu.h
index 7b2ef5b10566..b65bf01a0101 100644
--- a/sys/i386/include/cpu.h
+++ b/sys/i386/include/cpu.h
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)cpu.h 5.4 (Berkeley) 5/9/91
- * $Id: cpu.h,v 1.35 1997/10/28 11:43:47 bde Exp $
+ * $Id: cpu.h,v 1.36 1998/08/31 08:41:40 kato Exp $
*/
#ifndef _MACHINE_CPU_H_
@@ -85,6 +85,8 @@
*/
#define need_resched() { want_resched = 1; aston(); }
+#define resched_wanted() want_resched
+
/*
* Arrange to handle pending profiling ticks before returning to user mode.
*
diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c
index a96d554b6517..d8e1f0818d0c 100644
--- a/sys/kern/kern_subr.c
+++ b/sys/kern/kern_subr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_subr.c 8.3 (Berkeley) 1/21/94
- * $Id: kern_subr.c,v 1.23 1999/01/08 17:31:10 eivind Exp $
+ * $Id: kern_subr.c,v 1.24 1999/01/10 01:58:24 eivind Exp $
*/
#include <sys/param.h>
@@ -44,6 +44,7 @@
#include <sys/proc.h>
#include <sys/malloc.h>
#include <sys/lock.h>
+#include <sys/resourcevar.h>
#include <sys/vnode.h>
#include <vm/vm.h>
@@ -51,6 +52,10 @@
#include <vm/vm_page.h>
#include <vm/vm_map.h>
+#include <machine/cpu.h>
+
+static void uio_yield __P((void));
+
int
uiomove(cp, n, uio)
register caddr_t cp;
@@ -81,6 +86,8 @@ uiomove(cp, n, uio)
case UIO_USERSPACE:
case UIO_USERISPACE:
+ if (resched_wanted())
+ uio_yield();
if (uio->uio_rw == UIO_READ)
error = copyout(cp, iov->iov_base, cnt);
else
@@ -139,6 +146,8 @@ uiomoveco(cp, n, uio, obj)
case UIO_USERSPACE:
case UIO_USERISPACE:
+ if (resched_wanted())
+ uio_yield();
if (uio->uio_rw == UIO_READ) {
if (vfs_ioopt && ((cnt & PAGE_MASK) == 0) &&
((((intptr_t) iov->iov_base) & PAGE_MASK) == 0) &&
@@ -214,6 +223,8 @@ uioread(n, uio, obj, nread)
cnt &= ~PAGE_MASK;
+ if (resched_wanted())
+ uio_yield();
error = vm_uiomove(&curproc->p_vmspace->vm_map, obj,
uio->uio_offset, cnt,
(vm_offset_t) iov->iov_base, &npagesmoved);
@@ -389,3 +400,17 @@ phashinit(elements, type, nentries)
*nentries = hashsize;
return (hashtbl);
}
+
+static void
+uio_yield()
+{
+ struct proc *p;
+ int s;
+
+ p = curproc;
+ s = splhigh();
+ setrunqueue(p);
+ p->p_stats->p_ru.ru_nivcsw++;
+ mi_switch();
+ splx(s);
+}