Author: kib
Date: Sun Nov 24 19:18:12 2019
New Revision: 355064
URL: https://svnweb.freebsd.org/changeset/base/355064

Log:
  Ignore object->handle for OBJ_ANON objects.
  
  Note that the change in vm_object_collapse() is arguably a correctness
  fix.  We must not collapse into content-identity carrying objects.
  
  Reviewed by:  jeff
  Tested by:    pho
  Sponsored by: The FreeBSD Foundation
  Differential revision:        https://reviews.freebsd.org/D22467

Modified:
  head/sys/vm/vm_map.c
  head/sys/vm/vm_object.c

Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c        Sun Nov 24 19:16:57 2019        (r355063)
+++ head/sys/vm/vm_map.c        Sun Nov 24 19:18:12 2019        (r355064)
@@ -3764,8 +3764,7 @@ vm_map_copy_entry(
                if ((src_object = src_entry->object.vm_object) != NULL) {
                        VM_OBJECT_WLOCK(src_object);
                        charged = ENTRY_CHARGED(src_entry);
-                       if (src_object->handle == NULL &&
-                           (src_object->flags & OBJ_ANON) != 0) {
+                       if ((src_object->flags & OBJ_ANON) != 0) {
                                vm_object_collapse(src_object);
                                if ((src_object->flags & OBJ_ONEMAPPING) != 0) {
                                        vm_object_split(src_entry);

Modified: head/sys/vm/vm_object.c
==============================================================================
--- head/sys/vm/vm_object.c     Sun Nov 24 19:16:57 2019        (r355063)
+++ head/sys/vm/vm_object.c     Sun Nov 24 19:18:12 2019        (r355064)
@@ -530,7 +530,7 @@ vm_object_vndeallocate(vm_object_t object)
 void
 vm_object_deallocate(vm_object_t object)
 {
-       vm_object_t temp;
+       vm_object_t robject, temp;
        bool released;
 
        while (object != NULL) {
@@ -565,19 +565,17 @@ vm_object_deallocate(vm_object_t object)
                        return;
                } else if (object->ref_count == 1) {
                        if (object->shadow_count == 0 &&
-                           object->handle == NULL &&
                            (object->flags & OBJ_ANON) != 0) {
                                vm_object_set_flag(object, OBJ_ONEMAPPING);
-                       } else if ((object->shadow_count == 1) &&
-                           (object->handle == NULL) &&
-                           (object->flags & OBJ_ANON) != 0) {
-                               vm_object_t robject;
-
+                       } else if (object->shadow_count == 1) {
+                               KASSERT((object->flags & OBJ_ANON) != 0,
+                                   ("obj %p with shadow_count > 0 is not anon",
+                                   object));
                                robject = LIST_FIRST(&object->shadow_head);
                                KASSERT(robject != NULL,
-                                   ("vm_object_deallocate: ref_count: %d, 
shadow_count: %d",
-                                        object->ref_count,
-                                        object->shadow_count));
+                                   ("vm_object_deallocate: ref_count: %d, "
+                                   "shadow_count: %d", object->ref_count,
+                                   object->shadow_count));
                                KASSERT((robject->flags & OBJ_TMPFS_NODE) == 0,
                                    ("shadowed tmpfs v_object %p", object));
                                if (!VM_OBJECT_TRYWLOCK(robject)) {
@@ -602,8 +600,7 @@ vm_object_deallocate(vm_object_t object)
                                 * deallocating its shadow.
                                 */
                                if ((robject->flags &
-                                   (OBJ_DEAD | OBJ_ANON)) == OBJ_ANON &&
-                                   robject->handle == NULL) {
+                                   (OBJ_DEAD | OBJ_ANON)) == OBJ_ANON) {
 
                                        refcount_acquire(&robject->ref_count);
 retry:
@@ -1302,7 +1299,7 @@ vm_object_shadow(
         * will be collapsed later.
         */
        if (source != NULL && source->ref_count == 1 &&
-           source->handle == NULL && (source->flags & OBJ_ANON) != 0)
+           (source->flags & OBJ_ANON) != 0)
                return;
 
        /*
@@ -1751,10 +1748,8 @@ vm_object_collapse(vm_object_t object)
                if ((backing_object->flags & OBJ_ANON) == 0)
                        break;
                VM_OBJECT_WLOCK(backing_object);
-               if (backing_object->handle != NULL ||
-                   (backing_object->flags & OBJ_DEAD) != 0 ||
-                   object->handle != NULL ||
-                   (object->flags & OBJ_DEAD) != 0) {
+               if ((backing_object->flags & OBJ_DEAD) != 0 ||
+                   (object->flags & (OBJ_DEAD | OBJ_ANON)) != OBJ_ANON) {
                        VM_OBJECT_WUNLOCK(backing_object);
                        break;
                }
@@ -2549,8 +2544,7 @@ DB_SHOW_COMMAND(vmochk, vm_object_check)
         * and none have zero ref counts.
         */
        TAILQ_FOREACH(object, &vm_object_list, object_list) {
-               if (object->handle == NULL &&
-                   (object->type == OBJT_DEFAULT || object->type == 
OBJT_SWAP)) {
+               if ((object->flags & OBJ_ANON) != 0) {
                        if (object->ref_count == 0) {
                                db_printf("vmochk: internal obj has zero ref 
count: %ld\n",
                                        (long)object->size);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to