diff options
author | Bruce Evans <bde@FreeBSD.org> | 1999-02-13 09:30:56 +0000 |
---|---|---|
committer | Bruce Evans <bde@FreeBSD.org> | 1999-02-13 09:30:56 +0000 |
commit | c65fd63b69ad576ea5900646be175e7316c5127c (patch) | |
tree | c37059ce864e12222e41fdaf238eda0e2dbd4329 | |
parent | ba26628572a899896a7452721aa09aff14d02648 (diff) |
Notes
-rw-r--r-- | sys/alpha/include/cpu.h | 4 | ||||
-rw-r--r-- | sys/i386/i386/mem.c | 13 | ||||
-rw-r--r-- | sys/i386/include/cpu.h | 4 | ||||
-rw-r--r-- | sys/kern/kern_subr.c | 27 |
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); +} |