diff options
author | alc <alc@FreeBSD.org> | 2003-04-26 18:33:18 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-04-26 18:33:18 +0000 |
commit | 373b18b5c3e31cb4f3cb8521afee7c1c65ef6143 (patch) | |
tree | 4ade157b5f3c66ff8728aec9733627e223572d47 /sys/vm | |
parent | 2b96da3888be4bbee530605fb5c59983451840bd (diff) | |
download | FreeBSD-src-373b18b5c3e31cb4f3cb8521afee7c1c65ef6143.zip FreeBSD-src-373b18b5c3e31cb4f3cb8521afee7c1c65ef6143.tar.gz |
- Convert vm_object_pip_wait() from using tsleep() to msleep().
- Make vm_object_pip_sleep() static.
- Lock the vm_object when performing vm_object_pip_wait().
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/swap_pager.c | 4 | ||||
-rw-r--r-- | sys/vm/vm_object.c | 14 | ||||
-rw-r--r-- | sys/vm/vm_object.h | 2 | ||||
-rw-r--r-- | sys/vm/vnode_pager.c | 11 |
4 files changed, 22 insertions, 9 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 4cff663..d68a465 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -428,7 +428,9 @@ swap_pager_dealloc(object) } mtx_unlock(&sw_alloc_mtx); + VM_OBJECT_LOCK(object); vm_object_pip_wait(object, "swpdea"); + VM_OBJECT_UNLOCK(object); /* * Free all remaining metadata. We only bother to free it from @@ -1775,7 +1777,9 @@ restart: * We wait on an arbitrary object to clock our rescans * to the rate of paging completion. */ + VM_OBJECT_LOCK(waitobj); vm_object_pip_wait(waitobj, "swpoff"); + VM_OBJECT_UNLOCK(waitobj); goto full_rescan; } if (*sw_used) diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 7aa399a..944d033 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -109,6 +109,7 @@ SYSCTL_INT(_vm, OID_AUTO, msync_flush_flags, static void vm_object_qcollapse(vm_object_t object); static int vm_object_page_collect_flush(vm_object_t object, vm_page_t p, int curgeneration, int pagerflags); +static void vm_object_pip_sleep(vm_object_t object, char *waitid); /* * Virtual memory objects maintain the actual data @@ -306,7 +307,7 @@ vm_object_pip_wakeupn(vm_object_t object, short i) } } -void +static void vm_object_pip_sleep(vm_object_t object, char *waitid) { GIANT_REQUIRED; @@ -323,9 +324,12 @@ vm_object_pip_sleep(vm_object_t object, char *waitid) void vm_object_pip_wait(vm_object_t object, char *waitid) { - GIANT_REQUIRED; - while (object->paging_in_progress) - vm_object_pip_sleep(object, waitid); + + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); + while (object->paging_in_progress) { + object->flags |= OBJ_PIPWNT; + msleep(object, VM_OBJECT_MTX(object), PVM, waitid, 0); + } } /* @@ -537,12 +541,12 @@ vm_object_terminate(vm_object_t object) */ VM_OBJECT_LOCK(object); vm_object_set_flag(object, OBJ_DEAD); - VM_OBJECT_UNLOCK(object); /* * wait for the pageout daemon to be done with the object */ vm_object_pip_wait(object, "objtrm"); + VM_OBJECT_UNLOCK(object); KASSERT(!object->paging_in_progress, ("vm_object_terminate: pageout in progress")); diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index f4890bc..b7090c3 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -174,6 +174,7 @@ extern vm_object_t kmem_object; #define VM_OBJECT_LOCK_ASSERT(object, type) \ mtx_assert(&(object)->mtx, (type)) #define VM_OBJECT_LOCKED(object) mtx_owned(&(object)->mtx) +#define VM_OBJECT_MTX(object) (&(object)->mtx) #define VM_OBJECT_UNLOCK(object) mtx_unlock(&(object)->mtx) #define vm_object_lock(object) \ @@ -187,7 +188,6 @@ void vm_object_pip_add(vm_object_t object, short i); void vm_object_pip_subtract(vm_object_t object, short i); void vm_object_pip_wakeup(vm_object_t object); void vm_object_pip_wakeupn(vm_object_t object, short i); -void vm_object_pip_sleep(vm_object_t object, char *waitid); void vm_object_pip_wait(vm_object_t object, char *waitid); vm_object_t vm_object_allocate (objtype_t, vm_pindex_t); diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 0be23ef..8115908 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -139,9 +139,11 @@ vnode_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, * If the object is being terminated, wait for it to * go away. */ - while (((object = vp->v_object) != NULL) && - (object->flags & OBJ_DEAD)) { - tsleep(object, PVM, "vadead", 0); + while ((object = vp->v_object) != NULL) { + VM_OBJECT_LOCK(object); + if ((object->flags & OBJ_DEAD) == 0) + break; + msleep(object, VM_OBJECT_MTX(object), PDROP | PVM, "vadead", 0); } if (vp->v_usecount == 0) @@ -159,6 +161,7 @@ vnode_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, vp->v_object = object; } else { object->ref_count++; + VM_OBJECT_UNLOCK(object); } VI_LOCK(vp); vp->v_usecount++; @@ -182,7 +185,9 @@ vnode_pager_dealloc(object) if (vp == NULL) panic("vnode_pager_dealloc: pager already dealloced"); + VM_OBJECT_LOCK(object); vm_object_pip_wait(object, "vnpdea"); + VM_OBJECT_UNLOCK(object); object->handle = NULL; object->type = OBJT_DEAD; |