svn commit: r284100 - in stable: 10/sys/vm 9/sys/vm
John Baldwin
jhb at FreeBSD.org
Sat Jun 6 20:37:46 UTC 2015
Author: jhb
Date: Sat Jun 6 20:37:40 2015
New Revision: 284100
URL: https://svnweb.freebsd.org/changeset/base/284100
Log:
MFC 261811,282660,282706:
Place VM objects on the object list when created and never remove them.
261811:
Fix function name in KASSERT().
282660:
Place VM objects on the object list when created and never remove them.
This is ok since objects come from a NOFREE zone and allows objects to
be locked while traversing the object list without triggering a LOR.
Ensure that objects on the list are marked DEAD while free or stillborn,
and that they have a refcount of zero. This required updating most of
the pagers to explicitly mark an object as dead when deallocating it.
(Only the vnode pager did this previously.)
282706:
Satisfy vm_object uma zone destructor requirements after r282660 when
vnode object creation raced.
Modified:
stable/9/sys/vm/default_pager.c
stable/9/sys/vm/device_pager.c
stable/9/sys/vm/phys_pager.c
stable/9/sys/vm/sg_pager.c
stable/9/sys/vm/swap_pager.c
stable/9/sys/vm/vm_meter.c
stable/9/sys/vm/vm_object.c
stable/9/sys/vm/vnode_pager.c
Directory Properties:
stable/9/sys/ (props changed)
Changes in other areas also in this revision:
Modified:
stable/10/sys/vm/default_pager.c
stable/10/sys/vm/device_pager.c
stable/10/sys/vm/phys_pager.c
stable/10/sys/vm/sg_pager.c
stable/10/sys/vm/swap_pager.c
stable/10/sys/vm/vm_meter.c
stable/10/sys/vm/vm_object.c
stable/10/sys/vm/vnode_pager.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/9/sys/vm/default_pager.c
==============================================================================
--- stable/9/sys/vm/default_pager.c Sat Jun 6 20:14:58 2015 (r284099)
+++ stable/9/sys/vm/default_pager.c Sat Jun 6 20:37:40 2015 (r284100)
@@ -113,6 +113,7 @@ default_pager_dealloc(object)
/*
* OBJT_DEFAULT objects have no special resources allocated to them.
*/
+ object->type = OBJT_DEAD;
}
/*
Modified: stable/9/sys/vm/device_pager.c
==============================================================================
--- stable/9/sys/vm/device_pager.c Sat Jun 6 20:14:58 2015 (r284099)
+++ stable/9/sys/vm/device_pager.c Sat Jun 6 20:37:40 2015 (r284100)
@@ -249,6 +249,8 @@ dev_pager_dealloc(object)
!= NULL)
dev_pager_free_page(object, m);
}
+ object->handle = NULL;
+ object->type = OBJT_DEAD;
}
static int
Modified: stable/9/sys/vm/phys_pager.c
==============================================================================
--- stable/9/sys/vm/phys_pager.c Sat Jun 6 20:14:58 2015 (r284099)
+++ stable/9/sys/vm/phys_pager.c Sat Jun 6 20:37:40 2015 (r284100)
@@ -129,6 +129,8 @@ phys_pager_dealloc(vm_object_t object)
mtx_unlock(&phys_pager_mtx);
VM_OBJECT_LOCK(object);
}
+ object->handle = NULL;
+ object->type = OBJT_DEAD;
}
/*
Modified: stable/9/sys/vm/sg_pager.c
==============================================================================
--- stable/9/sys/vm/sg_pager.c Sat Jun 6 20:14:58 2015 (r284099)
+++ stable/9/sys/vm/sg_pager.c Sat Jun 6 20:37:40 2015 (r284100)
@@ -128,6 +128,8 @@ sg_pager_dealloc(vm_object_t object)
sg = object->handle;
sglist_free(sg);
+ object->handle = NULL;
+ object->type = OBJT_DEAD;
}
static int
Modified: stable/9/sys/vm/swap_pager.c
==============================================================================
--- stable/9/sys/vm/swap_pager.c Sat Jun 6 20:14:58 2015 (r284099)
+++ stable/9/sys/vm/swap_pager.c Sat Jun 6 20:37:40 2015 (r284100)
@@ -685,6 +685,8 @@ swap_pager_dealloc(vm_object_t object)
* if paging is still in progress on some objects.
*/
swp_pager_meta_free_all(object);
+ object->handle = NULL;
+ object->type = OBJT_DEAD;
}
/************************************************************************
Modified: stable/9/sys/vm/vm_meter.c
==============================================================================
--- stable/9/sys/vm/vm_meter.c Sat Jun 6 20:14:58 2015 (r284099)
+++ stable/9/sys/vm/vm_meter.c Sat Jun 6 20:37:40 2015 (r284100)
@@ -110,14 +110,7 @@ vmtotal(SYSCTL_HANDLER_ARGS)
*/
mtx_lock(&vm_object_list_mtx);
TAILQ_FOREACH(object, &vm_object_list, object_list) {
- if (!VM_OBJECT_TRYLOCK(object)) {
- /*
- * Avoid a lock-order reversal. Consequently,
- * the reported number of active pages may be
- * greater than the actual number.
- */
- continue;
- }
+ VM_OBJECT_LOCK(object);
vm_object_clear_flag(object, OBJ_ACTIVE);
VM_OBJECT_UNLOCK(object);
}
@@ -195,10 +188,9 @@ vmtotal(SYSCTL_HANDLER_ARGS)
mtx_lock(&vm_object_list_mtx);
TAILQ_FOREACH(object, &vm_object_list, object_list) {
/*
- * Perform unsynchronized reads on the object to avoid
- * a lock-order reversal. In this case, the lack of
- * synchronization should not impair the accuracy of
- * the reported statistics.
+ * Perform unsynchronized reads on the object. In
+ * this case, the lack of synchronization should not
+ * impair the accuracy of the reported statistics.
*/
if (object->type == OBJT_DEVICE || object->type == OBJT_SG) {
/*
Modified: stable/9/sys/vm/vm_object.c
==============================================================================
--- stable/9/sys/vm/vm_object.c Sat Jun 6 20:14:58 2015 (r284099)
+++ stable/9/sys/vm/vm_object.c Sat Jun 6 20:37:40 2015 (r284100)
@@ -164,6 +164,8 @@ vm_object_zdtor(void *mem, int size, voi
vm_object_t object;
object = (vm_object_t)mem;
+ KASSERT(object->ref_count == 0,
+ ("object %p ref_count = %d", object, object->ref_count));
KASSERT(TAILQ_EMPTY(&object->memq),
("object %p has resident pages",
object));
@@ -184,6 +186,9 @@ vm_object_zdtor(void *mem, int size, voi
KASSERT(object->shadow_count == 0,
("object %p shadow_count = %d",
object, object->shadow_count));
+ KASSERT(object->type == OBJT_DEAD,
+ ("object %p has non-dead type %d",
+ object, object->type));
}
#endif
@@ -197,9 +202,15 @@ vm_object_zinit(void *mem, int size, int
VM_OBJECT_LOCK_INIT(object, "standard object");
/* These are true for any object that has been freed */
+ object->type = OBJT_DEAD;
+ object->ref_count = 0;
object->paging_in_progress = 0;
object->resident_page_count = 0;
object->shadow_count = 0;
+
+ mtx_lock(&vm_object_list_mtx);
+ TAILQ_INSERT_TAIL(&vm_object_list, object, object_list);
+ mtx_unlock(&vm_object_list_mtx);
return (0);
}
@@ -229,10 +240,6 @@ _vm_object_allocate(objtype_t type, vm_p
LIST_INIT(&object->rvq);
#endif
object->cache = NULL;
-
- mtx_lock(&vm_object_list_mtx);
- TAILQ_INSERT_TAIL(&vm_object_list, object, object_list);
- mtx_unlock(&vm_object_list_mtx);
}
/*
@@ -641,20 +648,9 @@ vm_object_destroy(vm_object_t object)
{
/*
- * Remove the object from the global object list.
- */
- mtx_lock(&vm_object_list_mtx);
- TAILQ_REMOVE(&vm_object_list, object, object_list);
- mtx_unlock(&vm_object_list_mtx);
-
- /*
* Release the allocation charge.
*/
if (object->cred != NULL) {
- KASSERT(object->type == OBJT_DEFAULT ||
- object->type == OBJT_SWAP,
- ("vm_object_terminate: non-swap obj %p has cred",
- object));
swap_release_by_cred(object->charge, object->cred);
object->charge = 0;
crfree(object->cred);
@@ -760,6 +756,10 @@ vm_object_terminate(vm_object_t object)
if (__predict_false(object->cache != NULL))
vm_page_cache_free(object, 0, 0);
+ KASSERT(object->cred == NULL || object->type == OBJT_DEFAULT ||
+ object->type == OBJT_SWAP,
+ ("%s: non-swap obj %p has cred", __func__, object));
+
/*
* Let the pager know object is dead.
*/
@@ -1749,6 +1749,8 @@ vm_object_collapse(vm_object_t object)
KASSERT(backing_object->ref_count == 1, (
"backing_object %p was somehow re-referenced during collapse!",
backing_object));
+ backing_object->type = OBJT_DEAD;
+ backing_object->ref_count = 0;
VM_OBJECT_UNLOCK(backing_object);
vm_object_destroy(backing_object);
Modified: stable/9/sys/vm/vnode_pager.c
==============================================================================
--- stable/9/sys/vm/vnode_pager.c Sat Jun 6 20:14:58 2015 (r284099)
+++ stable/9/sys/vm/vnode_pager.c Sat Jun 6 20:37:40 2015 (r284100)
@@ -231,6 +231,12 @@ retry:
* Object has been created while we were sleeping
*/
VI_UNLOCK(vp);
+ VM_OBJECT_LOCK(object);
+ KASSERT(object->ref_count == 1,
+ ("leaked ref %p %d", object, object->ref_count));
+ object->type = OBJT_DEAD;
+ object->ref_count = 0;
+ VM_OBJECT_UNLOCK(object);
vm_object_destroy(object);
goto retry;
}
More information about the svn-src-stable-9
mailing list