diff options
author | alc <alc@FreeBSD.org> | 2003-06-19 02:01:33 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-06-19 02:01:33 +0000 |
commit | f3d52988e2e807349945dad818ba3d84a63b1b2f (patch) | |
tree | bb3bafb52369f001e889f8cac3e0f8d9fa1c8c9d /sys/dev | |
parent | cb7655e83ca9b041e0778916546d916aeb75cd5e (diff) | |
download | FreeBSD-src-f3d52988e2e807349945dad818ba3d84a63b1b2f.zip FreeBSD-src-f3d52988e2e807349945dad818ba3d84a63b1b2f.tar.gz |
Add vm object locking.
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/agp/agp.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/dev/agp/agp.c b/sys/dev/agp/agp.c index 65ca245..6744a86 100644 --- a/sys/dev/agp/agp.c +++ b/sys/dev/agp/agp.c @@ -421,8 +421,10 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem, * AGP_PAGE_SIZE. If this is the first call to bind, * the pages will be allocated and zeroed. */ + VM_OBJECT_LOCK(mem->am_obj); m = vm_page_grab(mem->am_obj, OFF_TO_IDX(i), VM_ALLOC_WIRED | VM_ALLOC_ZERO | VM_ALLOC_RETRY); + VM_OBJECT_UNLOCK(mem->am_obj); if ((m->flags & PG_ZERO) == 0) pmap_zero_page(m); AGP_DPF("found page pa=%#x\n", VM_PAGE_TO_PHYS(m)); @@ -449,6 +451,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem, vm_page_unlock_queues(); for (k = 0; k < i + j; k += AGP_PAGE_SIZE) AGP_UNBIND_PAGE(dev, offset + k); + VM_OBJECT_LOCK(mem->am_obj); for (k = 0; k <= i; k += PAGE_SIZE) { m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(k)); @@ -456,6 +459,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem, vm_page_unwire(m, 0); vm_page_unlock_queues(); } + VM_OBJECT_UNLOCK(mem->am_obj); lockmgr(&sc->as_lock, LK_RELEASE, 0, curthread); return error; } @@ -505,12 +509,14 @@ agp_generic_unbind_memory(device_t dev, struct agp_memory *mem) */ for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) AGP_UNBIND_PAGE(dev, mem->am_offset + i); + VM_OBJECT_LOCK(mem->am_obj); for (i = 0; i < mem->am_size; i += PAGE_SIZE) { m = vm_page_lookup(mem->am_obj, atop(i)); vm_page_lock_queues(); vm_page_unwire(m, 0); vm_page_unlock_queues(); } + VM_OBJECT_UNLOCK(mem->am_obj); agp_flush_cache(); AGP_FLUSH_TLB(dev); |