--- Net2/vm/vm_object.c 2018/04/24 18:03:57 1.1 +++ Net2/vm/vm_object.c 2018/04/24 18:14:58 1.1.1.3 @@ -33,7 +33,8 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)vm_object.c 7.4 (Berkeley) 5/7/91 + * from: @(#)vm_object.c 7.4 (Berkeley) 5/7/91 + * vm_object.c,v 1.4 1993/06/30 03:48:26 andrew Exp * * * Copyright (c) 1987, 1990 Carnegie-Mellon University. @@ -248,6 +249,26 @@ void vm_object_deallocate(object) */ if (object->can_persist) { + register vm_page_t p; + + /* + * Check for dirty pages in object + * Print warning as this may signify kernel bugs + * pk@cs.few.eur.nl - 4/15/93 + */ + p = (vm_page_t) queue_first(&object->memq); + while (!queue_end(&object->memq, (queue_entry_t) p)) { + VM_PAGE_CHECK(p); + + if (pmap_is_modified(VM_PAGE_TO_PHYS(p)) || + !p->clean) { + + printf("vm_object_dealloc: persistent object %x isn't clean\n", object); + goto cant_persist; + } + + p = (vm_page_t) queue_next(&p->listq); + } queue_enter(&vm_object_cached_list, object, vm_object_t, cached_list); @@ -260,6 +281,7 @@ void vm_object_deallocate(object) vm_object_cache_trim(); return; } + cant_persist:; /* * Make sure no one can look us up now. @@ -454,7 +476,11 @@ vm_object_deactivate_pages(object) while (!queue_end(&object->memq, (queue_entry_t) p)) { next = (vm_page_t) queue_next(&p->listq); vm_page_lock_queues(); - vm_page_deactivate(p); + if (!p->busy) + vm_page_deactivate(p); /* optimisation from mach 3.0 - + * andrew@werple.apana.org.au, + * Feb '93 + */ vm_page_unlock_queues(); p = next; } @@ -1141,12 +1167,29 @@ void vm_object_collapse(object) } else { if (pp) { +#if 1 + /* + * This should never happen -- the + * parent cannot have ever had an + * external memory object, and thus + * cannot have absent pages. + */ + panic("vm_object_collapse: bad case"); + /* andrew@werple.apana.org.au - from + mach 3.0 VM */ +#else /* may be someone waiting for it */ PAGE_WAKEUP(pp); vm_page_lock_queues(); vm_page_free(pp); vm_page_unlock_queues(); +#endif } + /* + * Parent now has no page. + * Move the backing object's page + * up. + */ vm_page_rename(p, object, new_offset); } } @@ -1161,7 +1204,21 @@ void vm_object_collapse(object) */ object->pager = backing_object->pager; +#if 1 + /* Mach 3.0 code */ + /* andrew@werple.apana.org.au, 12 Feb 1993 */ + + /* + * If there is no pager, leave paging-offset alone. + */ + if (object->pager) + object->paging_offset = + backing_object->paging_offset + + backing_offset; +#else + /* old VM 2.5 version */ object->paging_offset += backing_offset; +#endif backing_object->pager = NULL; @@ -1260,6 +1317,18 @@ void vm_object_collapse(object) vm_object_reference(object->shadow = backing_object->shadow); object->shadow_offset += backing_object->shadow_offset; +#if 1 + /* Mach 3.0 code */ + /* andrew@werple.apana.org.au, 12 Feb 1993 */ + + /* + * Backing object might have had a copy pointer + * to us. If it did, clear it. + */ + if (backing_object->copy == object) + backing_object->copy = NULL; +#endif + /* Drop the reference count on backing_object. * Since its ref_count was at least 2, it * will not vanish; so we don't need to call