diff options
| author | Alan Cox <alc@FreeBSD.org> | 2003-05-04 06:56:27 +0000 |
|---|---|---|
| committer | Alan Cox <alc@FreeBSD.org> | 2003-05-04 06:56:27 +0000 |
| commit | c4a1d732a3b92de223db5b6773f40773fba899a9 (patch) | |
| tree | 344a330d99d7d97644afa8b9a62d5497144dd2d9 | |
| parent | df788a526fed8e87814f9dec0c525a64d17e6d03 (diff) | |
Notes
| -rw-r--r-- | sys/vm/vm_pageout.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index eacbd14fe39d..9cfb24c8df67 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -613,25 +613,25 @@ vm_pageout_map_deactivate_pages(map, desired) #endif /* !defined(NO_SWAPPING) */ /* - * Don't try to be fancy - being fancy can lead to VOP_LOCK's and therefore - * to vnode deadlocks. We only do it for OBJT_DEFAULT and OBJT_SWAP objects - * which we know can be trivially freed. + * Warning! The page queue lock is released and reacquired. */ static void vm_pageout_page_free(vm_page_t m) { vm_object_t object = m->object; - int type = object->type; mtx_assert(&vm_page_queue_mtx, MA_OWNED); - if (type == OBJT_SWAP || type == OBJT_DEFAULT) - vm_object_reference(object); vm_page_busy(m); + vm_page_unlock_queues(); + /* + * Avoid a lock order reversal. The page must be busy. + */ + VM_OBJECT_LOCK(object); + vm_page_lock_queues(); pmap_remove_all(m); vm_page_free(m); + VM_OBJECT_UNLOCK(object); cnt.v_dfree++; - if (type == OBJT_SWAP || type == OBJT_DEFAULT) - vm_object_deallocate(object); } /* |
