Date: Sun, 24 Nov 2019 19:18:13 +0000 (UTC) From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r355064 - head/sys/vm Message-ID: <201911241918.xAOJIDab091893@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201911241918.xAOJIDab091893>