This commit was manufactured by cvs2svn to create tag 'FreeBSD-release/1.0'.
[unix-history] / sys / vm / vm_object.c
index fdb465c..28845b6 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * 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
+ *     $Id$
+ */
+
+/*
  * Copyright (c) 1987, 1990 Carnegie-Mellon University.
  * All rights reserved.
  *
  * Copyright (c) 1987, 1990 Carnegie-Mellon University.
  * All rights reserved.
  *
  *
  * any improvements or extensions that they make and grant Carnegie the
  * rights to redistribute these changes.
  *
  * any improvements or extensions that they make and grant Carnegie the
  * rights to redistribute these changes.
- *
- * PATCHES MAGIC                LEVEL   PATCH THAT GOT US HERE
- * --------------------         -----   ----------------------
- * CURRENT PATCH LEVEL:         1       00147
- * --------------------         -----   ----------------------
- *
- * 20 Apr 93   Paul Kranenburg         Detect and prevent kernel deadlocks in
- *                                     VM system
  */
 
 /*
  *     Virtual memory object module.
  */
 
  */
 
 /*
  *     Virtual memory object module.
  */
 
+#include "ddb.h"
+
 #include "param.h"
 #include "malloc.h"
 
 #include "param.h"
 #include "malloc.h"
 
@@ -256,6 +252,7 @@ void vm_object_deallocate(object)
                 */
 
                if (object->can_persist) {
                 */
 
                if (object->can_persist) {
+#ifdef DIAGNOSTIC
                        register vm_page_t      p;
 
                        /*
                        register vm_page_t      p;
 
                        /*
@@ -276,6 +273,7 @@ void vm_object_deallocate(object)
 
                                p = (vm_page_t) queue_next(&p->listq);
                        }
 
                                p = (vm_page_t) queue_next(&p->listq);
                        }
+#endif /* DIAGNOSTIC */
 
                        queue_enter(&vm_object_cached_list, object,
                                vm_object_t, cached_list);
 
                        queue_enter(&vm_object_cached_list, object,
                                vm_object_t, cached_list);
@@ -483,7 +481,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();
        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;
        }
                vm_page_unlock_queues();
                p = next;
        }
@@ -1170,12 +1172,29 @@ void vm_object_collapse(object)
                                    }
                                    else {
                                        if (pp) {
                                    }
                                    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();
                                            /* 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);
                                    }
                                }
                                        vm_page_rename(p, object, new_offset);
                                    }
                                }
@@ -1190,7 +1209,21 @@ void vm_object_collapse(object)
                         */
 
                        object->pager = backing_object->pager;
                         */
 
                        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;
                        object->paging_offset += backing_offset;
+#endif
 
                        backing_object->pager = NULL;
 
 
                        backing_object->pager = NULL;
 
@@ -1289,6 +1322,18 @@ void vm_object_collapse(object)
                        vm_object_reference(object->shadow = backing_object->shadow);
                        object->shadow_offset += backing_object->shadow_offset;
 
                        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
                        /*      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
@@ -1428,6 +1473,7 @@ boolean_t vm_object_coalesce(prev_object, next_object,
        return(TRUE);
 }
 
        return(TRUE);
 }
 
+#if defined(DEBUG) || (NDDB > 0)
 /*
  *     vm_object_print:        [ debug ]
  */
 /*
  *     vm_object_print:        [ debug ]
  */
@@ -1476,3 +1522,4 @@ void vm_object_print(object, full)
                printf("\n");
        indent -= 2;
 }
                printf("\n");
        indent -= 2;
 }
+#endif /* defined(DEBUG) || (NDDB > 0) */