--- Net2/vm/vm_page.c 2018/04/24 18:06:48 1.1.1.2 +++ 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. @@ -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 @@ -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;