diff options
author | alc <alc@FreeBSD.org> | 2003-06-28 21:21:04 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-06-28 21:21:04 +0000 |
commit | 247977dd5d3f68c8e8f40fa35949a23cfca2d2c1 (patch) | |
tree | 224a696b4c58ad31ab6e24a7922249eef3ca37f1 | |
parent | df16822d6955771600be7a6c284af3cb96a1971c (diff) | |
download | FreeBSD-src-247977dd5d3f68c8e8f40fa35949a23cfca2d2c1.zip FreeBSD-src-247977dd5d3f68c8e8f40fa35949a23cfca2d2c1.tar.gz |
MFi386
Add vm object locking to pmap_object_init_pt().
-rw-r--r-- | sys/alpha/alpha/pmap.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/alpha/alpha/pmap.c b/sys/alpha/alpha/pmap.c index c14e42d..d4166a3 100644 --- a/sys/alpha/alpha/pmap.c +++ b/sys/alpha/alpha/pmap.c @@ -2090,18 +2090,18 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, if (pmap == NULL || object == NULL) return; - + VM_OBJECT_LOCK(object); psize = alpha_btop(size); if ((object->type != OBJT_VNODE) || ((limit & MAP_PREFAULT_PARTIAL) && (psize > MAX_INIT_PT) && (object->resident_page_count > MAX_INIT_PT))) { - return; + goto unlock_return; } if (psize + pindex > object->size) { if (object->size < pindex) - return; + goto unlock_return; psize = object->size - pindex; } @@ -2141,8 +2141,10 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_page_deactivate(p); vm_page_busy(p); vm_page_unlock_queues(); + VM_OBJECT_UNLOCK(object); mpte = pmap_enter_quick(pmap, addr + alpha_ptob(tmpidx), p, mpte); + VM_OBJECT_LOCK(object); vm_page_lock_queues(); vm_page_wakeup(p); } @@ -2173,15 +2175,18 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_page_deactivate(p); vm_page_busy(p); vm_page_unlock_queues(); + VM_OBJECT_UNLOCK(object); mpte = pmap_enter_quick(pmap, addr + alpha_ptob(tmpidx), p, mpte); + VM_OBJECT_LOCK(object); vm_page_lock_queues(); vm_page_wakeup(p); } vm_page_unlock_queues(); } } - return; +unlock_return: + VM_OBJECT_UNLOCK(object); } /* |