diff --git a/sys/dev/agp/agp.c b/sys/dev/agp/agp.c --- a/sys/dev/agp/agp.c +++ b/sys/dev/agp/agp.c @@ -56,6 +56,7 @@ #include #include #include +#include #include #include @@ -539,6 +540,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem, vm_offset_t offset) { + struct pctrie_iter pages; struct agp_softc *sc = device_get_softc(dev); vm_offset_t i, j, k; vm_page_t m; @@ -571,7 +573,7 @@ AGP_DPF("found page pa=%#jx\n", (uintmax_t)VM_PAGE_TO_PHYS(m)); } VM_OBJECT_WUNLOCK(mem->am_obj); - + vm_page_iter_init(&pages, mem->am_obj); mtx_lock(&sc->as_lock); if (mem->am_is_bound) { @@ -588,7 +590,7 @@ */ VM_OBJECT_WLOCK(mem->am_obj); for (i = 0; i < mem->am_size; i += PAGE_SIZE) { - m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(i)); + m = vm_radix_iter_lookup(&pages, OFF_TO_IDX(i)); /* * Install entries in the GATT, making sure that if @@ -609,6 +611,7 @@ */ for (k = 0; k < i + j; k += AGP_PAGE_SIZE) AGP_UNBIND_PAGE(dev, offset + k); + pctrie_iter_reset(&pages); goto bad; } } @@ -631,7 +634,7 @@ mtx_unlock(&sc->as_lock); VM_OBJECT_ASSERT_WLOCKED(mem->am_obj); for (k = 0; k < mem->am_size; k += PAGE_SIZE) { - m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(k)); + m = vm_radix_iter_lookup(&pages, OFF_TO_IDX(k)); if (k >= i) vm_page_xunbusy(m); vm_page_unwire(m, PQ_INACTIVE); @@ -644,6 +647,7 @@ int agp_generic_unbind_memory(device_t dev, struct agp_memory *mem) { + struct pctrie_iter pages; struct agp_softc *sc = device_get_softc(dev); vm_page_t m; int i; @@ -665,9 +669,10 @@ AGP_FLUSH_TLB(dev); + vm_page_iter_init(&pages, mem->am_obj); VM_OBJECT_WLOCK(mem->am_obj); for (i = 0; i < mem->am_size; i += PAGE_SIZE) { - m = vm_page_lookup(mem->am_obj, atop(i)); + m = vm_radix_iter_lookup(&pages, atop(i)); vm_page_unwire(m, PQ_INACTIVE); } VM_OBJECT_WUNLOCK(mem->am_obj);