git: b6cd84ca2d08 - main - powerpc: replace tailq pointers with iterators

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Mon, 21 Apr 2025 04:13:02 UTC
The branch main has been updated by dougm:

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

commit b6cd84ca2d08b39e6a51a782ddf2b58293be6cba
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-04-21 04:04:43 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-04-21 04:04:43 +0000

    powerpc: replace tailq pointers with iterators
    
    Change architecture-specific code to use iterators rather than tailq
    pointers.
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D49927
---
 sys/powerpc/aim/mmu_oea.c   | 16 ++++++++++------
 sys/powerpc/aim/mmu_oea64.c | 17 ++++++++++-------
 sys/powerpc/aim/mmu_radix.c | 31 +++++++++++++++++--------------
 sys/powerpc/booke/pmap.c    | 15 +++++++++------
 4 files changed, 46 insertions(+), 33 deletions(-)

diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index 7f1f64a51db5..7746b668265d 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -135,6 +135,7 @@
 #include <vm/vm_page.h>
 #include <vm/vm_phys.h>
 #include <vm/vm_pageout.h>
+#include <vm/vm_radix.h>
 #include <vm/uma.h>
 
 #include <machine/cpu.h>
@@ -1235,20 +1236,23 @@ void
 moea_enter_object(pmap_t pm, vm_offset_t start, vm_offset_t end,
     vm_page_t m_start, vm_prot_t prot)
 {
+	struct pctrie_iter pages;
+	vm_offset_t va;
 	vm_page_t m;
-	vm_pindex_t diff, psize;
 
 	VM_OBJECT_ASSERT_LOCKED(m_start->object);
 
-	psize = atop(end - start);
-	m = m_start;
+	vm_page_iter_limit_init(&pages, m_start->object,
+	    m_start->pindex + atop(end - start));
+	m = vm_radix_iter_lookup(&pages, m_start->pindex);
 	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pm);
-	while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
-		moea_enter_locked(pm, start + ptoa(diff), m, prot &
+	while (m != NULL) {
+		va = start + ptoa(m->pindex - m_start->pindex);
+		moea_enter_locked(pm, va, m, prot &
 		    (VM_PROT_READ | VM_PROT_EXECUTE), PMAP_ENTER_QUICK_LOCKED,
 		    0);
-		m = TAILQ_NEXT(m, listq);
+		m = vm_radix_iter_step(&pages);
 	}
 	rw_wunlock(&pvh_global_lock);
 	PMAP_UNLOCK(pm);
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index 7e23d73557a5..e24f591498dd 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -81,6 +81,7 @@
 #include <vm/vm_extern.h>
 #include <vm/vm_pageout.h>
 #include <vm/vm_dumpset.h>
+#include <vm/vm_radix.h>
 #include <vm/vm_reserv.h>
 #include <vm/uma.h>
 
@@ -1826,17 +1827,18 @@ void
 moea64_enter_object(pmap_t pm, vm_offset_t start, vm_offset_t end,
     vm_page_t m_start, vm_prot_t prot)
 {
+	struct pctrie_iter pages;
 	vm_page_t m;
-	vm_pindex_t diff, psize;
 	vm_offset_t va;
 	int8_t psind;
 
 	VM_OBJECT_ASSERT_LOCKED(m_start->object);
 
-	psize = atop(end - start);
-	m = m_start;
-	while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
-		va = start + ptoa(diff);
+	vm_page_iter_limit_init(&pages, m_start->object,
+	    m_start->pindex + atop(end - start));
+	m = vm_radix_iter_lookup(&pages, m_start->pindex);
+	while (m != NULL) {
+		va = start + ptoa(m->pindex - m_start->pindex);
 		if ((va & HPT_SP_MASK) == 0 && va + HPT_SP_SIZE <= end &&
 		    m->psind == 1 && moea64_ps_enabled(pm))
 			psind = 1;
@@ -1846,8 +1848,9 @@ moea64_enter_object(pmap_t pm, vm_offset_t start, vm_offset_t end,
 		    (VM_PROT_READ | VM_PROT_EXECUTE),
 		    PMAP_ENTER_NOSLEEP | PMAP_ENTER_QUICK_LOCKED, psind);
 		if (psind == 1)
-			m = &m[HPT_SP_SIZE / PAGE_SIZE - 1];
-		m = TAILQ_NEXT(m, listq);
+			m = vm_radix_iter_jump(&pages, HPT_SP_SIZE / PAGE_SIZE);
+		else
+			m = vm_radix_iter_step(&pages);
 	}
 }
 
diff --git a/sys/powerpc/aim/mmu_radix.c b/sys/powerpc/aim/mmu_radix.c
index 388ab386b35a..cda8dd1c0946 100644
--- a/sys/powerpc/aim/mmu_radix.c
+++ b/sys/powerpc/aim/mmu_radix.c
@@ -3334,33 +3334,34 @@ void
 mmu_radix_enter_object(pmap_t pmap, vm_offset_t start,
     vm_offset_t end, vm_page_t m_start, vm_prot_t prot)
 {
-
+	struct pctrie_iter pages;
 	struct rwlock *lock;
 	vm_offset_t va;
 	vm_page_t m, mpte;
-	vm_pindex_t diff, psize;
 	bool invalidate;
+
 	VM_OBJECT_ASSERT_LOCKED(m_start->object);
 
 	CTR6(KTR_PMAP, "%s(%p, %#x, %#x, %p, %#x)", __func__, pmap, start,
 	    end, m_start, prot);
-
 	invalidate = false;
-	psize = atop(end - start);
 	mpte = NULL;
-	m = m_start;
+	vm_page_iter_limit_init(&pages, m_start->object,
+	    m_start->pindex + atop(end - start));
+	m = vm_radix_iter_lookup(&pages, m_start->pindex);
 	lock = NULL;
 	PMAP_LOCK(pmap);
-	while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
-		va = start + ptoa(diff);
+	while (m != NULL) {
+		va = start + ptoa(m->pindex - m_start->pindex);
 		if ((va & L3_PAGE_MASK) == 0 && va + L3_PAGE_SIZE <= end &&
 		    m->psind == 1 && mmu_radix_ps_enabled(pmap) &&
-		    pmap_enter_2mpage(pmap, va, m, prot, &lock))
-			m = &m[L3_PAGE_SIZE / PAGE_SIZE - 1];
-		else
+		    pmap_enter_2mpage(pmap, va, m, prot, &lock)) {
+			m = vm_radix_iter_jump(&pages, L3_PAGE_SIZE / PAGE_SIZE);
+		} else {
 			mpte = mmu_radix_enter_quick_locked(pmap, va, m, prot,
 			    mpte, &lock, &invalidate);
-		m = TAILQ_NEXT(m, listq);
+			m = vm_radix_iter_step(&pages);
+		}
 	}
 	ptesync();
 	if (lock != NULL)
@@ -4043,6 +4044,7 @@ void
 mmu_radix_object_init_pt(pmap_t pmap, vm_offset_t addr,
     vm_object_t object, vm_pindex_t pindex, vm_size_t size)
 {
+	struct pctrie_iter pages;
 	pml3_entry_t *l3e;
 	vm_paddr_t pa, ptepa;
 	vm_page_t p, pdpg;
@@ -4059,7 +4061,9 @@ mmu_radix_object_init_pt(pmap_t pmap, vm_offset_t addr,
 			return;
 		if (!vm_object_populate(object, pindex, pindex + atop(size)))
 			return;
-		p = vm_page_lookup(object, pindex);
+		vm_page_iter_init(&pages, object);
+		p = vm_radix_iter_lookup(&pages, pindex);
+		
 		KASSERT(p->valid == VM_PAGE_BITS_ALL,
 		    ("pmap_object_init_pt: invalid page %p", p));
 		ma = p->md.mdpg_cache_attrs;
@@ -4077,15 +4081,14 @@ mmu_radix_object_init_pt(pmap_t pmap, vm_offset_t addr,
 		 * the pages are not physically contiguous or have differing
 		 * memory attributes.
 		 */
-		p = TAILQ_NEXT(p, listq);
 		for (pa = ptepa + PAGE_SIZE; pa < ptepa + size;
 		    pa += PAGE_SIZE) {
+			p = vm_radix_iter_next(&pages);
 			KASSERT(p->valid == VM_PAGE_BITS_ALL,
 			    ("pmap_object_init_pt: invalid page %p", p));
 			if (pa != VM_PAGE_TO_PHYS(p) ||
 			    ma != p->md.mdpg_cache_attrs)
 				return;
-			p = TAILQ_NEXT(p, listq);
 		}
 
 		PMAP_LOCK(pmap);
diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c
index 9f96255ea00e..62fd21d4f073 100644
--- a/sys/powerpc/booke/pmap.c
+++ b/sys/powerpc/booke/pmap.c
@@ -1457,20 +1457,23 @@ static void
 mmu_booke_enter_object(pmap_t pmap, vm_offset_t start,
     vm_offset_t end, vm_page_t m_start, vm_prot_t prot)
 {
+	struct pctrie_iter pages;
+	vm_offset_t va;
 	vm_page_t m;
-	vm_pindex_t diff, psize;
 
 	VM_OBJECT_ASSERT_LOCKED(m_start->object);
 
-	psize = atop(end - start);
-	m = m_start;
+	vm_page_iter_limit_init(&pages, m_start->object,
+	    m_start->pindex + atop(end - start));
+	m = vm_radix_iter_lookup(&pages, m_start->pindex);
 	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pmap);
-	while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
-		mmu_booke_enter_locked(pmap, start + ptoa(diff), m,
+	while (m != NULL) {
+		va = start + ptoa(m->pindex - m_start->pindex);
+		mmu_booke_enter_locked(pmap, va, m,
 		    prot & (VM_PROT_READ | VM_PROT_EXECUTE),
 		    PMAP_ENTER_NOSLEEP | PMAP_ENTER_QUICK_LOCKED, 0);
-		m = TAILQ_NEXT(m, listq);
+		m = vm_radix_iter_step(&pages);
 	}
 	PMAP_UNLOCK(pmap);
 	rw_wunlock(&pvh_global_lock);