--- Net2/vm/vm_page.c 2018/04/24 18:03:57 1.1 +++ Net2/vm/vm_page.c 2018/04/24 18:15:00 1.1.1.4 @@ -33,7 +33,8 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)vm_page.c 7.4 (Berkeley) 5/7/91 + * from: @(#)vm_page.c 7.4 (Berkeley) 5/7/91 + * vm_page.c,v 1.5 1993/06/30 03:48:25 andrew Exp * * * Copyright (c) 1987, 1990 Carnegie-Mellon University. @@ -204,7 +205,7 @@ vm_offset_t vm_page_startup(start, end, vaddr = pmap_map(mapped, start, new_start, VM_PROT_READ|VM_PROT_WRITE); start = new_start; - blkclr((caddr_t) mapped, vaddr - mapped); + bzero((caddr_t) mapped, vaddr - mapped); mapped = vaddr; for (i = vm_page_bucket_count; i--;) { @@ -244,7 +245,7 @@ vm_offset_t vm_page_startup(start, end, new_start = start + (vaddr - mapped); pmap_map(mapped, start, new_start, VM_PROT_READ|VM_PROT_WRITE); - blkclr((caddr_t) mapped, (vaddr - mapped)); + bzero((caddr_t) mapped, (vaddr - mapped)); mapped = vaddr; start = new_start; @@ -255,7 +256,7 @@ vm_offset_t vm_page_startup(start, end, */ vm_page_free_count = npages = - (end - start)/(PAGE_SIZE + sizeof(struct vm_page)); + (end - start + sizeof(struct vm_page))/(PAGE_SIZE + sizeof(struct vm_page)); /* * Initialize the mem entry structures now, and @@ -283,7 +284,7 @@ vm_offset_t vm_page_startup(start, end, /* * Clear all of the page structures */ - blkclr((caddr_t)m, npages * sizeof(*m)); + bzero((caddr_t)m, npages * sizeof(*m)); pa = first_phys_addr; while (npages--) { @@ -547,6 +548,14 @@ vm_page_t vm_page_alloc(object, offset) spl = splimp(); /* XXX */ simple_lock(&vm_page_queue_free_lock); + if ( object != kernel_object && + object != kmem_object && + vm_page_free_count <= vm_page_free_reserved) { + + simple_unlock(&vm_page_queue_free_lock); + splx(spl); + return(NULL); + } if (queue_empty(&vm_page_queue_free)) { simple_unlock(&vm_page_queue_free_lock); splx(spl); @@ -687,15 +696,22 @@ void vm_page_deactivate(m) /* * Only move active pages -- ignore locked or already * inactive ones. + * + * XXX: sometimes we get pages which aren't wired down + * or on any queue - we need to put them on the inactive + * queue also, otherwise we lose track of them. + * Paul Mackerras (paulus@cs.anu.edu.au) 9-Jan-93. */ - if (m->active) { + if (!m->inactive && m->wire_count == 0) { pmap_clear_reference(VM_PAGE_TO_PHYS(m)); - queue_remove(&vm_page_queue_active, m, vm_page_t, pageq); + if (m->active) { + queue_remove(&vm_page_queue_active, m, vm_page_t, pageq); + m->active = FALSE; + vm_page_active_count--; + } queue_enter(&vm_page_queue_inactive, m, vm_page_t, pageq); - m->active = FALSE; m->inactive = TRUE; - vm_page_active_count--; vm_page_inactive_count++; if (pmap_is_modified(VM_PAGE_TO_PHYS(m))) m->clean = FALSE;