Skip site navigation (1)Skip section navigation (2)
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>