git: 81bd0f46fcf0 - main - intel_idpgtbl: use FORALL macro for page walk

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Fri, 18 Apr 2025 17:24:26 UTC
The branch main has been updated by dougm:

URL: https://cgit.FreeBSD.org/src/commit/?id=81bd0f46fcf07a2748f8093c07ece66227f03ae4

commit 81bd0f46fcf07a2748f8093c07ece66227f03ae4
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-04-18 17:21:48 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-04-18 17:24:05 +0000

    intel_idpgtbl: use FORALL macro for page walk
    
    Change two loops to use VM_RADIX_FORALL and drop the use of vm_page_next().
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D49891
---
 sys/x86/iommu/intel_idpgtbl.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/sys/x86/iommu/intel_idpgtbl.c b/sys/x86/iommu/intel_idpgtbl.c
index b133dc875515..e13555cdaaba 100644
--- a/sys/x86/iommu/intel_idpgtbl.c
+++ b/sys/x86/iommu/intel_idpgtbl.c
@@ -56,6 +56,7 @@
 #include <vm/vm_page.h>
 #include <vm/vm_pager.h>
 #include <vm/vm_map.h>
+#include <vm/vm_radix.h>
 #include <dev/pci/pcireg.h>
 #include <machine/atomic.h>
 #include <machine/bus.h>
@@ -165,6 +166,7 @@ dmar_idmap_nextlvl(struct idpgtbl *tbl, int lvl, vm_pindex_t idx,
 vm_object_t
 dmar_get_idmap_pgtbl(struct dmar_domain *domain, iommu_gaddr_t maxaddr)
 {
+	struct pctrie_iter pages;
 	struct dmar_unit *unit;
 	struct idpgtbl *tbl;
 	vm_object_t res;
@@ -260,9 +262,9 @@ end:
 	 */
 	unit = domain->dmar;
 	if (!DMAR_IS_COHERENT(unit)) {
+		vm_page_iter_init(&pages, res);
 		VM_OBJECT_WLOCK(res);
-		for (m = vm_page_lookup(res, 0); m != NULL;
-		     m = vm_page_next(m))
+		VM_RADIX_FORALL(m, &pages)
 			pmap_invalidate_cache_pages(&m, 1);
 		VM_OBJECT_WUNLOCK(res);
 	}
@@ -707,6 +709,7 @@ dmar_domain_alloc_pgtbl(struct dmar_domain *domain)
 void
 dmar_domain_free_pgtbl(struct dmar_domain *domain)
 {
+	struct pctrie_iter pages;
 	vm_object_t obj;
 	vm_page_t m;
 
@@ -728,7 +731,8 @@ dmar_domain_free_pgtbl(struct dmar_domain *domain)
 
 	/* Obliterate ref_counts */
 	VM_OBJECT_ASSERT_WLOCKED(obj);
-	for (m = vm_page_lookup(obj, 0); m != NULL; m = vm_page_next(m)) {
+	vm_page_iter_init(&pages, obj);
+	VM_RADIX_FORALL(m, &pages) {
 		vm_page_clearref(m);
 		vm_wire_sub(1);
 	}