diff options
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/init_main.c | 4 | ||||
-rw-r--r-- | sys/kern/kern_exit.c | 5 | ||||
-rw-r--r-- | sys/kern/kern_fork.c | 5 | ||||
-rw-r--r-- | sys/kern/kern_malloc.c | 5 | ||||
-rw-r--r-- | sys/kern/kern_proc.c | 5 | ||||
-rw-r--r-- | sys/kern/kern_subr.c | 7 | ||||
-rw-r--r-- | sys/kern/sys_process.c | 10 | ||||
-rw-r--r-- | sys/kern/vfs_bio.c | 27 | ||||
-rw-r--r-- | sys/kern/vfs_export.c | 10 | ||||
-rw-r--r-- | sys/kern/vfs_subr.c | 10 |
10 files changed, 58 insertions, 30 deletions
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index 620e1b9..03f707c 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -39,7 +39,7 @@ * SUCH DAMAGE. * * @(#)init_main.c 8.9 (Berkeley) 1/21/94 - * $Id: init_main.c,v 1.78 1997/12/12 04:00:57 dyson Exp $ + * $Id: init_main.c,v 1.79 1997/12/14 02:10:12 dyson Exp $ */ #include "opt_devfs.h" @@ -403,7 +403,7 @@ proc0_init(dummy) vmspace0.vm_refcnt = 1; pmap_pinit0(&vmspace0.vm_pmap); vm_map_init(&vmspace0.vm_map, round_page(VM_MIN_ADDRESS), - trunc_page(VM_MAXUSER_ADDRESS), TRUE); + trunc_page(VM_MAXUSER_ADDRESS)); vmspace0.vm_map.pmap = &vmspace0.vm_pmap; p->p_addr = proc0paddr; /* XXX */ diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 9052225..48e9abc 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_exit.c 8.7 (Berkeley) 2/12/94 - * $Id: kern_exit.c,v 1.63 1997/12/08 01:06:36 sef Exp $ + * $Id: kern_exit.c,v 1.64 1997/12/16 17:40:14 eivind Exp $ */ #include "opt_compat.h" @@ -71,6 +71,7 @@ #include <sys/lock.h> #include <vm/pmap.h> #include <vm/vm_map.h> +#include <vm/vm_zone.h> static MALLOC_DEFINE(M_ZOMBIE, "zombie", "zombie proc status"); @@ -492,7 +493,7 @@ loop: * release while still running in process context. */ cpu_wait(p); - FREE(p, M_PROC); + zfree(proc_zone, p); nprocs--; return (0); } diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index df7b863..26cbe47 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_fork.c 8.6 (Berkeley) 4/8/94 - * $Id: kern_fork.c,v 1.49 1997/11/20 16:36:17 bde Exp $ + * $Id: kern_fork.c,v 1.50 1997/12/12 04:00:58 dyson Exp $ */ #include "opt_ktrace.h" @@ -60,6 +60,7 @@ #include <vm/pmap.h> #include <vm/vm_map.h> #include <vm/vm_extern.h> +#include <vm/vm_zone.h> #ifdef SMP static int fast_vfork = 0; /* Doesn't work on SMP yet. */ @@ -226,7 +227,7 @@ fork1(p1, flags) } /* Allocate new proc. */ - MALLOC(newproc, struct proc *, sizeof(struct proc), M_PROC, M_WAITOK); + newproc = zalloc(proc_zone); /* * Setup linkage for kernel based threading diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c index d32a756..02be8ce 100644 --- a/sys/kern/kern_malloc.c +++ b/sys/kern/kern_malloc.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)kern_malloc.c 8.3 (Berkeley) 1/4/94 - * $Id: kern_malloc.c,v 1.37 1997/10/28 19:00:53 phk Exp $ + * $Id: kern_malloc.c,v 1.38 1997/12/05 05:36:36 dyson Exp $ */ #include <sys/param.h> @@ -387,8 +387,7 @@ kmeminit(dummy) kmemusage = (struct kmemusage *) kmem_alloc(kernel_map, (vm_size_t)(npg * sizeof(struct kmemusage))); kmem_map = kmem_suballoc(kernel_map, (vm_offset_t *)&kmembase, - (vm_offset_t *)&kmemlimit, (vm_size_t)(npg * PAGE_SIZE), - FALSE); + (vm_offset_t *)&kmemlimit, (vm_size_t)(npg * PAGE_SIZE)); kmem_map->system_map = 1; for (indx = 0; indx < MINBUCKET + 16; indx++) { if (1 << indx >= PAGE_SIZE) diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 35e3046..460e9fb 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)kern_proc.c 8.7 (Berkeley) 2/14/95 - * $Id: kern_proc.c,v 1.29 1997/10/11 18:31:23 phk Exp $ + * $Id: kern_proc.c,v 1.30 1997/10/12 20:23:52 phk Exp $ */ #include <sys/param.h> @@ -47,6 +47,7 @@ #include <vm/pmap.h> #include <vm/vm_map.h> #include <sys/user.h> +#include <vm/vm_zone.h> static MALLOC_DEFINE(M_PGRP, "pgrp", "process group header"); MALLOC_DEFINE(M_SESSION, "session", "session header"); @@ -82,6 +83,7 @@ struct pgrphashhead *pgrphashtbl; u_long pgrphash; struct proclist allproc; struct proclist zombproc; +vm_zone_t proc_zone; /* * Initialize global process hashing structures. @@ -95,6 +97,7 @@ procinit() pidhashtbl = hashinit(maxproc / 4, M_PROC, &pidhash); pgrphashtbl = hashinit(maxproc / 4, M_PROC, &pgrphash); uihashtbl = hashinit(maxproc / 16, M_PROC, &uihash); + proc_zone = zinit("PROC", sizeof (struct proc), 0, 0, 5); } /* diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c index 169711d..de1bf7d 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.14 1997/12/19 09:03:23 dyson Exp $ + * $Id: kern_subr.c,v 1.15 1998/01/06 05:15:41 dyson Exp $ */ #include <sys/param.h> @@ -44,6 +44,7 @@ #include <sys/proc.h> #include <sys/malloc.h> #include <sys/lock.h> +#include <sys/vnode.h> #include <vm/vm.h> #include <vm/vm_prot.h> @@ -141,7 +142,7 @@ uiomoveco(cp, n, uio, obj) case UIO_USERSPACE: case UIO_USERISPACE: if (uio->uio_rw == UIO_READ) { - if (((cnt & PAGE_MASK) == 0) && + if (vfs_ioopt && ((cnt & PAGE_MASK) == 0) && ((((int) iov->iov_base) & PAGE_MASK) == 0) && ((uio->uio_offset & PAGE_MASK) == 0) && ((((int) cp) & PAGE_MASK) == 0)) { @@ -190,6 +191,8 @@ uioread(n, uio, obj, nread) int error; *nread = 0; + if (vfs_ioopt > 1) + return 0; error = 0; while (n > 0 && uio->uio_resid) { diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index c289115..ac779bc 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: sys_process.c,v 1.32 1997/11/12 12:28:12 tegge Exp $ + * $Id: sys_process.c,v 1.33 1997/12/06 04:11:10 sef Exp $ */ #include <sys/param.h> @@ -62,7 +62,7 @@ pread (struct proc *procp, unsigned int addr, unsigned int *retval) { vm_offset_t pageno; /* page number */ vm_map_entry_t out_entry; vm_prot_t out_prot; - boolean_t wired, single_use; + boolean_t wired; vm_pindex_t pindex; /* Map page into kernel space */ @@ -74,7 +74,7 @@ pread (struct proc *procp, unsigned int addr, unsigned int *retval) { tmap = map; rv = vm_map_lookup (&tmap, pageno, VM_PROT_READ, &out_entry, - &object, &pindex, &out_prot, &wired, &single_use); + &object, &pindex, &out_prot, &wired); if (rv != KERN_SUCCESS) return EINVAL; @@ -110,7 +110,7 @@ pwrite (struct proc *procp, unsigned int addr, unsigned int datum) { vm_offset_t pageno; /* page number */ vm_map_entry_t out_entry; vm_prot_t out_prot; - boolean_t wired, single_use; + boolean_t wired; vm_pindex_t pindex; boolean_t fix_prot = 0; @@ -148,7 +148,7 @@ pwrite (struct proc *procp, unsigned int addr, unsigned int datum) { tmap = map; rv = vm_map_lookup (&tmap, pageno, VM_PROT_WRITE, &out_entry, - &object, &pindex, &out_prot, &wired, &single_use); + &object, &pindex, &out_prot, &wired); if (rv != KERN_SUCCESS) { return EINVAL; } diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index d00bffe..22acde6 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -11,7 +11,7 @@ * 2. Absolutely no warranty of function or purpose is made by the author * John S. Dyson. * - * $Id: vfs_bio.c,v 1.142 1998/01/12 01:46:25 dyson Exp $ + * $Id: vfs_bio.c,v 1.143 1998/01/17 09:16:26 dyson Exp $ */ /* @@ -177,6 +177,7 @@ bufinit() bp->b_wcred = NOCRED; bp->b_qindex = QUEUE_EMPTY; bp->b_vnbufs.le_next = NOLIST; + bp->b_generation = 0; TAILQ_INSERT_TAIL(&bufqueues[QUEUE_EMPTY], bp, b_freelist); LIST_INSERT_HEAD(&invalhash, bp, b_hash); } @@ -654,6 +655,7 @@ brelse(struct buf * bp) LIST_INSERT_HEAD(&invalhash, bp, b_hash); bp->b_dev = NODEV; kvafreespace += bp->b_kvasize; + bp->b_generation++; /* buffers with junk contents */ } else if (bp->b_flags & (B_ERROR | B_INVAL | B_NOCACHE | B_RELBUF)) { @@ -663,6 +665,7 @@ brelse(struct buf * bp) LIST_REMOVE(bp, b_hash); LIST_INSERT_HEAD(&invalhash, bp, b_hash); bp->b_dev = NODEV; + bp->b_generation++; /* buffers that are locked */ } else if (bp->b_flags & B_LOCKED) { @@ -1083,6 +1086,7 @@ trytofreespace: brelvp(bp); fillbuf: + bp->b_generation++; /* we are not free, nor do we contain interesting data */ if (bp->b_rcred != NOCRED) { @@ -1348,6 +1352,7 @@ getblk(struct vnode * vp, daddr_t blkno, int size, int slpflag, int slptimeo) int s; struct bufhashhdr *bh; int maxsize; + int generation; if (vp->v_mount) { maxsize = vp->v_mount->mnt_stat.f_iosize; @@ -1370,18 +1375,23 @@ loop: if (numfreebuffers < lofreebuffers) { waitfreebuffers(slpflag, slptimeo); } - + if ((bp = gbincore(vp, blkno))) { +loop1: + generation = bp->b_generation; if (bp->b_flags & B_BUSY) { bp->b_flags |= B_WANTED; if (bp->b_usecount < BUF_MAXUSE) ++bp->b_usecount; if (!tsleep(bp, - (PRIBIO + 1) | slpflag, "getblk", slptimeo)) - goto loop; - - splx(s); - return (struct buf *) NULL; + (PRIBIO + 1) | slpflag, "getblk", slptimeo)) { + if (bp->b_generation != generation) + goto loop; + goto loop1; + } else { + splx(s); + return (struct buf *) NULL; + } } bp->b_flags |= B_BUSY | B_CACHE; bremfree(bp); @@ -1394,6 +1404,7 @@ loop: */ if (bp->b_bcount != size) { + bp->b_generation++; if ((bp->b_flags & B_VMIO) && (size <= bp->b_kvasize)) { allocbuf(bp, size); } else { @@ -1683,6 +1694,7 @@ allocbuf(struct buf * bp, int size) m = vm_page_alloc(obj, objoff, VM_ALLOC_NORMAL); if (!m) { VM_WAIT; + vm_pageout_deficit += (desiredpages - bp->b_npages); goto doretry; } /* @@ -2240,6 +2252,7 @@ tryagain: ((pg - VM_MIN_KERNEL_ADDRESS) >> PAGE_SHIFT), VM_ALLOC_NORMAL); if (!p) { + vm_pageout_deficit += (to - from) >> PAGE_SHIFT; VM_WAIT; goto tryagain; } diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index 3b0eb61..2bfc934 100644 --- a/sys/kern/vfs_export.c +++ b/sys/kern/vfs_export.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 - * $Id: vfs_subr.c,v 1.123 1998/01/12 03:15:01 dyson Exp $ + * $Id: vfs_subr.c,v 1.124 1998/01/17 09:16:28 dyson Exp $ */ /* @@ -68,6 +68,7 @@ #include <vm/vm_map.h> #include <vm/vm_pager.h> #include <vm/vnode_pager.h> +#include <vm/vm_zone.h> #include <sys/sysctl.h> #include <miscfs/specfs/specdev.h> @@ -120,6 +121,7 @@ struct simplelock mntvnode_slock; struct simplelock vnode_free_list_slock; static struct simplelock spechash_slock; struct nfs_public nfs_pub; /* publicly exported FS */ +static vm_zone_t vnode_zone; int desiredvnodes; SYSCTL_INT(_kern, KERN_MAXVNODES, maxvnodes, CTLFLAG_RW, &desiredvnodes, 0, ""); @@ -144,6 +146,7 @@ vntblinit() TAILQ_INIT(&vnode_tobefree_list); simple_lock_init(&vnode_free_list_slock); CIRCLEQ_INIT(&mountlist); + vnode_zone = zinit("VNODE", sizeof (struct vnode), 0, 0, 5); } /* @@ -457,8 +460,7 @@ getnewvnode(tag, mp, vops, vpp) vp->v_writecount = 0; /* XXX */ } else { simple_unlock(&vnode_free_list_slock); - vp = (struct vnode *) malloc((u_long) sizeof *vp, - M_VNODE, M_WAITOK); + vp = (struct vnode *) zalloc(vnode_zone); bzero((char *) vp, sizeof *vp); simple_lock_init(&vp->v_interlock); vp->v_dd = vp; @@ -917,6 +919,7 @@ vget(vp, flags, p) ((vp->v_object == NULL) || (vp->v_object->flags & OBJ_DEAD))) { vfs_object_create(vp, curproc, curproc->p_ucred, 0); + simple_lock(&vp->v_interlock); } if (flags & LK_TYPE_MASK) { if (error = vn_lock(vp, flags | LK_INTERLOCK, p)) @@ -1390,6 +1393,7 @@ vgonel(vp, p) * Clean out the filesystem specific data. */ vclean(vp, DOCLOSE, p); + simple_lock(&vp->v_interlock); /* * Delete from old mount point vnode list, if on one. diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 3b0eb61..2bfc934 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 - * $Id: vfs_subr.c,v 1.123 1998/01/12 03:15:01 dyson Exp $ + * $Id: vfs_subr.c,v 1.124 1998/01/17 09:16:28 dyson Exp $ */ /* @@ -68,6 +68,7 @@ #include <vm/vm_map.h> #include <vm/vm_pager.h> #include <vm/vnode_pager.h> +#include <vm/vm_zone.h> #include <sys/sysctl.h> #include <miscfs/specfs/specdev.h> @@ -120,6 +121,7 @@ struct simplelock mntvnode_slock; struct simplelock vnode_free_list_slock; static struct simplelock spechash_slock; struct nfs_public nfs_pub; /* publicly exported FS */ +static vm_zone_t vnode_zone; int desiredvnodes; SYSCTL_INT(_kern, KERN_MAXVNODES, maxvnodes, CTLFLAG_RW, &desiredvnodes, 0, ""); @@ -144,6 +146,7 @@ vntblinit() TAILQ_INIT(&vnode_tobefree_list); simple_lock_init(&vnode_free_list_slock); CIRCLEQ_INIT(&mountlist); + vnode_zone = zinit("VNODE", sizeof (struct vnode), 0, 0, 5); } /* @@ -457,8 +460,7 @@ getnewvnode(tag, mp, vops, vpp) vp->v_writecount = 0; /* XXX */ } else { simple_unlock(&vnode_free_list_slock); - vp = (struct vnode *) malloc((u_long) sizeof *vp, - M_VNODE, M_WAITOK); + vp = (struct vnode *) zalloc(vnode_zone); bzero((char *) vp, sizeof *vp); simple_lock_init(&vp->v_interlock); vp->v_dd = vp; @@ -917,6 +919,7 @@ vget(vp, flags, p) ((vp->v_object == NULL) || (vp->v_object->flags & OBJ_DEAD))) { vfs_object_create(vp, curproc, curproc->p_ucred, 0); + simple_lock(&vp->v_interlock); } if (flags & LK_TYPE_MASK) { if (error = vn_lock(vp, flags | LK_INTERLOCK, p)) @@ -1390,6 +1393,7 @@ vgonel(vp, p) * Clean out the filesystem specific data. */ vclean(vp, DOCLOSE, p); + simple_lock(&vp->v_interlock); /* * Delete from old mount point vnode list, if on one. |