--- Gnu-Mach/vm/vm_resident.c 2020/09/02 04:42:51 1.1.1.2 +++ Gnu-Mach/vm/vm_resident.c 2020/09/02 04:45:24 1.1.1.3 @@ -32,33 +32,37 @@ * * Resident memory management module. */ -#include + +#include +#include #include #include +#include #include #include #include #include -#include "vm_param.h" +#include #include -#include +#include #include #include #include #include #include -#include #if MACH_VM_DEBUG #include #include #include #endif -/* in zalloc.c XXX */ -extern vm_offset_t zdata; -extern vm_size_t zdata_size; +#if MACH_KDB +#include +#include +#endif /* MACH_KDB */ + /* * Associated with eacn page of user-allocatable memory is a @@ -124,7 +128,7 @@ unsigned int vm_page_free_count_minimum; * These page structures are allocated the way * most other kernel structures are. */ -zone_t vm_page_zone; +struct kmem_cache vm_page_cache; /* * Fictitious pages don't have a physical address, @@ -237,14 +241,11 @@ void vm_page_bootstrap( vm_page_free_wanted = 0; /* - * Steal memory for the zone system. + * Steal memory for the kernel map entries. */ - kentry_data_size = kentry_count * sizeof(struct vm_map_entry); kentry_data = pmap_steal_memory(kentry_data_size); - zdata = pmap_steal_memory(zdata_size); - /* * Allocate (and initialize) the virtual-to-physical * table hash buckets. @@ -391,6 +392,11 @@ void pmap_startup( vm_page_init(&pages[i], paddr); pages_initialized++; } + i = 0; + while (pmap_next_page(&paddr)) + i++; + if (i) + printf("%u memory page(s) left away\n", i); /* * Release pages in reverse order so that physical pages @@ -423,10 +429,8 @@ void pmap_startup( */ void vm_page_module_init(void) { - vm_page_zone = zinit((vm_size_t) sizeof(struct vm_page), - VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS, - PAGE_SIZE, - 0, "vm pages"); + kmem_cache_init(&vm_page_cache, "vm_page", sizeof(struct vm_page), 0, + NULL, NULL, NULL, 0); } /* @@ -448,7 +452,7 @@ void vm_page_create( for (paddr = round_page(start); paddr < trunc_page(end); paddr += PAGE_SIZE) { - m = (vm_page_t) zalloc(vm_page_zone); + m = (vm_page_t) kmem_cache_alloc(&vm_page_cache); if (m == VM_PAGE_NULL) panic("vm_page_create"); @@ -519,6 +523,10 @@ void vm_page_insert( */ object->resident_page_count++; + assert(object->resident_page_count >= 0); + + if (object->can_persist && (object->ref_count == 0)) + vm_object_cached_pages_update(1); /* * Detect sequential access and inactivate previous page. @@ -587,6 +595,10 @@ void vm_page_replace( m->tabled = FALSE; object->resident_page_count--; + if (object->can_persist + && (object->ref_count == 0)) + vm_object_cached_pages_update(-1); + /* * Return page to the free list. * Note the page is not tabled now, so this @@ -618,6 +630,10 @@ void vm_page_replace( */ object->resident_page_count++; + assert(object->resident_page_count >= 0); + + if (object->can_persist && (object->ref_count == 0)) + vm_object_cached_pages_update(1); } /* @@ -673,6 +689,9 @@ void vm_page_remove( mem->object->resident_page_count--; mem->tabled = FALSE; + + if (mem->object->can_persist && (mem->object->ref_count == 0)) + vm_object_cached_pages_update(-1); } /* @@ -803,7 +822,7 @@ void vm_page_more_fictitious(void) int i; for (i = 0; i < vm_page_fictitious_quantum; i++) { - m = (vm_page_t) zalloc(vm_page_zone); + m = (vm_page_t) kmem_cache_alloc(&vm_page_cache); if (m == VM_PAGE_NULL) panic("vm_page_more_fictitious"); @@ -933,7 +952,7 @@ vm_page_grab_contiguous_pages( register int first_set; int size, alloc_size; kern_return_t ret; - vm_page_t mem, prevmem; + vm_page_t mem, *prevmemp; #ifndef NBBY #define NBBY 8 /* size in bits of sizeof()`s unity */ @@ -961,7 +980,7 @@ vm_page_grab_contiguous_pages( } else alloc_size = 0; - bzero(bits, size); + memset(bits, 0, size); /* * A very large granularity call, its rare so that is ok @@ -974,6 +993,7 @@ vm_page_grab_contiguous_pages( if ((vm_page_free_count < vm_page_free_reserved) || (vm_page_external_count >= vm_page_external_limit)) { + printf_once("no more room for vm_page_grab_contiguous_pages"); simple_unlock(&vm_page_queue_free_lock); return KERN_RESOURCE_SHORTAGE; } @@ -1041,7 +1061,6 @@ count_ones: * search for beans here */ bits_so_far = 0; -count_zeroes: while ((bitpos < NBPEL) && ((v & 1) == 0)) { bitpos++; v >>= 1; @@ -1061,9 +1080,9 @@ count_zeroes: /* * We could not find enough contiguous pages. */ -not_found_em: simple_unlock(&vm_page_queue_free_lock); + printf_once("no contiguous room for vm_page_grab_contiguous_pages"); ret = KERN_RESOURCE_SHORTAGE; goto out; @@ -1088,7 +1107,7 @@ found_em: /* running pointers */ mem = vm_page_queue_free; - prevmem = VM_PAGE_NULL; + prevmemp = &vm_page_queue_free; while (mem) { @@ -1098,8 +1117,7 @@ found_em: if ((addr >= first_phys) && (addr < last_phys)) { - if (prevmem) - prevmem->pageq.next = mem->pageq.next; + *prevmemp = (vm_page_t) mem->pageq.next; pages[(addr - first_phys) >> PAGE_SHIFT] = mem; mem->free = FALSE; mem->extcounted = mem->external = external; @@ -1108,7 +1126,7 @@ found_em: */ if (--npages == 0) break; } else - prevmem = mem; + prevmemp = (vm_page_t *) &mem->pageq.next; mem = (vm_page_t) mem->pageq.next; } @@ -1200,10 +1218,6 @@ void vm_page_wait( void (*continuation)(void)) { -#ifndef CONTINUATIONS - assert (continuation == 0); -#endif - /* * We can't use vm_page_free_reserved to make this * determination. Consider: some thread might @@ -1483,7 +1497,7 @@ vm_page_info( } #endif /* MACH_VM_DEBUG */ -#include + #if MACH_KDB #define printf kdbprintf