diff options
author | dyson <dyson@FreeBSD.org> | 1996-10-15 03:16:45 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1996-10-15 03:16:45 +0000 |
commit | 4af9184e0bea01af54e4f4eea2e0c9564f86df2e (patch) | |
tree | c9194db409b09e876921cd1dea089c7bb1a5c7d2 /sys/vm | |
parent | 4b6e5c4c291e78bbabf104576e9ee98db0f7459c (diff) | |
download | FreeBSD-src-4af9184e0bea01af54e4f4eea2e0c9564f86df2e.zip FreeBSD-src-4af9184e0bea01af54e4f4eea2e0c9564f86df2e.tar.gz |
Move much of the machine dependent code from vm_glue.c into
pmap.c. Along with the improved organization, small proc fork
performance is now about 5%-10% faster.
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/pmap.h | 6 | ||||
-rw-r--r-- | sys/vm/vm_glue.c | 111 | ||||
-rw-r--r-- | sys/vm/vm_page.c | 5 |
3 files changed, 12 insertions, 110 deletions
diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h index 25b3953..2144280 100644 --- a/sys/vm/pmap.h +++ b/sys/vm/pmap.h @@ -61,7 +61,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: pmap.h,v 1.14 1996/07/30 03:08:04 dyson Exp $ + * $Id: pmap.h,v 1.15 1996/09/08 20:44:31 dyson Exp $ */ /* @@ -126,6 +126,10 @@ void pmap_zero_page __P((vm_offset_t)); void pmap_prefault __P((pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry, vm_object_t object)); int pmap_mincore __P((pmap_t pmap, vm_offset_t addr)); +void pmap_new_proc __P((struct proc *p)); +void pmap_dispose_proc __P((struct proc *p)); +void pmap_swapout_proc __P((struct proc *p)); +void pmap_swapin_proc __P((struct proc *p)); #endif /* KERNEL */ diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index fee37a2..a76bdeb 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -59,7 +59,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: vm_glue.c,v 1.52 1996/07/02 02:07:56 dyson Exp $ + * $Id: vm_glue.c,v 1.53 1996/09/15 11:24:21 bde Exp $ */ #include <sys/param.h> @@ -205,55 +205,9 @@ vm_fork(p1, p2) if (p1->p_vmspace->vm_shm) shmfork(p1, p2); - /* - * Allocate a wired-down (for now) pcb and kernel stack for the - * process - */ - - pvp = &p2->p_vmspace->vm_pmap; - - /* - * allocate object for the upages - */ - p2->p_vmspace->vm_upages_obj = upobj = vm_object_allocate( OBJT_DEFAULT, - UPAGES); - - /* get a kernel virtual address for the UPAGES for this proc */ - up = (struct user *) kmem_alloc_pageable(u_map, UPAGES * PAGE_SIZE); - if (up == NULL) - panic("vm_fork: u_map allocation failed"); - - for(i=0;i<UPAGES;i++) { - vm_page_t m; - - /* - * Get a kernel stack page - */ - while ((m = vm_page_alloc(upobj, - i, VM_ALLOC_NORMAL)) == NULL) { - VM_WAIT; - } + pmap_new_proc(p2); - /* - * Wire the page - */ - vm_page_wire(m); - PAGE_WAKEUP(m); - - /* - * Enter the page into both the kernel and the process - * address space. - */ - pmap_enter( pvp, (vm_offset_t) kstack + i * PAGE_SIZE, - VM_PAGE_TO_PHYS(m), VM_PROT_READ|VM_PROT_WRITE, TRUE); - pmap_kenter(((vm_offset_t) up) + i * PAGE_SIZE, - VM_PAGE_TO_PHYS(m)); - m->flags &= ~PG_ZERO; - m->flags |= PG_MAPPED|PG_WRITEABLE; - m->valid = VM_PAGE_BITS_ALL; - } - - p2->p_addr = up; + up = p2->p_addr; /* * p_stats and p_sigacts currently point at fields in the user struct @@ -318,51 +272,11 @@ faultin(p) int s; if ((p->p_flag & P_INMEM) == 0) { - pmap_t pmap = &p->p_vmspace->vm_pmap; - vm_page_t m; - vm_object_t upobj = p->p_vmspace->vm_upages_obj; ++p->p_lock; -#if defined(SWAP_DEBUG) - printf("swapping in %d\n", p->p_pid); -#endif - for(i=0;i<UPAGES;i++) { - int s; - s = splvm(); -retry: - if ((m = vm_page_lookup(upobj, i)) == NULL) { - if ((m = vm_page_alloc(upobj, i, VM_ALLOC_NORMAL)) == NULL) { - VM_WAIT; - goto retry; - } - } else { - if ((m->flags & PG_BUSY) || m->busy) { - m->flags |= PG_WANTED; - tsleep(m, PVM, "swinuw",0); - goto retry; - } - m->flags |= PG_BUSY; - } - vm_page_wire(m); - splx(s); - - pmap_enter( pmap, (vm_offset_t) kstack + i * PAGE_SIZE, - VM_PAGE_TO_PHYS(m), VM_PROT_READ|VM_PROT_WRITE, TRUE); - pmap_kenter(((vm_offset_t) p->p_addr) + i * PAGE_SIZE, - VM_PAGE_TO_PHYS(m)); - if (m->valid != VM_PAGE_BITS_ALL) { - int rv; - rv = vm_pager_get_pages(upobj, - &m, 1, 0); - if (rv != VM_PAGER_OK) - panic("faultin: cannot get upages for proc: %d\n", p->p_pid); - m->valid = VM_PAGE_BITS_ALL; - } - PAGE_WAKEUP(m); - m->flags |= PG_MAPPED|PG_WRITEABLE; - } - + pmap_swapin_proc(p); + s = splhigh(); if (p->p_stat == SRUN) @@ -541,20 +455,7 @@ swapout(p) remrq(p); (void) spl0(); - /* - * let the upages be paged - */ - for(i=0;i<UPAGES;i++) { - vm_page_t m; - if ((m = vm_page_lookup(p->p_vmspace->vm_upages_obj, i)) == NULL) - panic("swapout: upage already missing???"); - m->dirty = VM_PAGE_BITS_ALL; - vm_page_unwire(m); - vm_page_deactivate(m); - pmap_kremove( (vm_offset_t) p->p_addr + PAGE_SIZE * i); - } - pmap_remove(pmap, (vm_offset_t) kstack, - (vm_offset_t) kstack + PAGE_SIZE * UPAGES); + pmap_swapout_proc(p); p->p_flag &= ~P_SWAPPING; p->p_swtime = 0; diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index c145486..ebf49e4 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)vm_page.c 7.4 (Berkeley) 5/7/91 - * $Id: vm_page.c,v 1.67 1996/10/06 18:27:39 dyson Exp $ + * $Id: vm_page.c,v 1.68 1996/10/12 20:09:48 bde Exp $ */ /* @@ -684,9 +684,6 @@ vm_page_select_free(object, pindex, prefqueue) #if PQ_L2_SIZE > 1 index = pindex + object->pg_color; - /* - * These are special cased because of clock-arithemetic - */ for(j = 0; j < PQ_L1_SIZE; j++) { for(i = (PQ_L2_SIZE/2) - (PQ_L1_SIZE - 1); (i + j) >= 0; |