mirror of
https://github.com/opnsense/src.git
synced 2026-06-21 06:29:21 -04:00
agp: use iterators to speed up lookups
agp_generic_bind_memory and agp_generic_unbind_memory do pctrie lookups for ranges of consecutive pages. Use iterators to improved the expected performance of those searches. Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D49917
This commit is contained in:
parent
60c4869ed5
commit
e1f3f15192
1 changed files with 9 additions and 4 deletions
|
|
@ -56,6 +56,7 @@
|
|||
#include <vm/vm_object.h>
|
||||
#include <vm/vm_page.h>
|
||||
#include <vm/vm_pageout.h>
|
||||
#include <vm/vm_radix.h>
|
||||
#include <vm/pmap.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
|
|
@ -539,6 +540,7 @@ int
|
|||
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_generic_bind_memory(device_t dev, struct agp_memory *mem,
|
|||
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 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem,
|
|||
*/
|
||||
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 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem,
|
|||
*/
|
||||
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 @@ bad:
|
|||
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 @@ bad:
|
|||
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_generic_unbind_memory(device_t dev, struct agp_memory *mem)
|
|||
|
||||
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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue