From e448f32b5288cd0687b93ea802a60f2dd9b488cd Mon Sep 17 00:00:00 2001 From: alc Date: Sat, 7 Jun 2003 23:22:04 +0000 Subject: Teach vm_page_grab() how to handle the vm object's lock. --- sys/vm/vm_page.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'sys/vm/vm_page.c') diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 8abde96..ff9a227 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -1443,9 +1443,13 @@ vm_page_t vm_page_grab(vm_object_t object, vm_pindex_t pindex, int allocflags) { vm_page_t m; - int s, generation; + int s, generation, is_object_locked; - GIANT_REQUIRED; + /* + * Remove is_object_locked after vm_object locking is finished. + */ + if (!(is_object_locked = VM_OBJECT_LOCKED(object))) + GIANT_REQUIRED; retrylookup: if ((m = vm_page_lookup(object, pindex)) != NULL) { vm_page_lock_queues(); @@ -1456,12 +1460,16 @@ retrylookup: while ((object->generation == generation) && (m->busy || (m->flags & PG_BUSY))) { vm_page_flag_set(m, PG_WANTED | PG_REFERENCED); - msleep(m, &vm_page_queue_mtx, PVM, "pgrbwt", 0); + if (is_object_locked) + VM_OBJECT_UNLOCK(object); + msleep(m, &vm_page_queue_mtx, PDROP | PVM, "pgrbwt", 0); + if (is_object_locked) + VM_OBJECT_LOCK(object); if ((allocflags & VM_ALLOC_RETRY) == 0) { - vm_page_unlock_queues(); splx(s); return NULL; } + vm_page_lock_queues(); } vm_page_unlock_queues(); splx(s); @@ -1477,7 +1485,11 @@ retrylookup: m = vm_page_alloc(object, pindex, allocflags & ~VM_ALLOC_RETRY); if (m == NULL) { + if (is_object_locked) + VM_OBJECT_UNLOCK(object); VM_WAIT; + if (is_object_locked) + VM_OBJECT_LOCK(object); if ((allocflags & VM_ALLOC_RETRY) == 0) return NULL; goto retrylookup; -- cgit v1.1