git: 81bd0f46fcf0 - main - intel_idpgtbl: use FORALL macro for page walk
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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); }