Date: Sat, 19 Apr 2025 22:32:52 GMT From: Doug Moore <dougm@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: e1f3f15192c1 - main - agp: use iterators to speed up lookups Message-ID: <202504192232.53JMWqSY084356@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by dougm: URL: https://cgit.FreeBSD.org/src/commit/?id=e1f3f15192c135817aff96a19161e946ba9eb9f3 commit e1f3f15192c135817aff96a19161e946ba9eb9f3 Author: Doug Moore <dougm@FreeBSD.org> AuthorDate: 2025-04-19 22:29:47 +0000 Commit: Doug Moore <dougm@FreeBSD.org> CommitDate: 2025-04-19 22:29:47 +0000 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 --- sys/dev/agp/agp.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/sys/dev/agp/agp.c b/sys/dev/agp/agp.c index 8db1e13f08de..b4fe186e4903 100644 --- a/sys/dev/agp/agp.c +++ b/sys/dev/agp/agp.c @@ -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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202504192232.53JMWqSY084356>