git: 60c4869ed58d - main - sgx: replace tailq pointers with iterators

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Sat, 19 Apr 2025 22:16:57 UTC
The branch main has been updated by dougm:

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

commit 60c4869ed58d98c27b0f4a35713963cda46e6a46
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-04-19 22:15:20 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-04-19 22:16:46 +0000

    sgx: replace tailq pointers with iterators
    
    In sgx code, use iterators to replace tailq pointers for page
    manipulation.
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D49919
---
 sys/amd64/sgx/sgx.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/sys/amd64/sgx/sgx.c b/sys/amd64/sgx/sgx.c
index 1cc268102b1f..af8adb763214 100644
--- a/sys/amd64/sgx/sgx.c
+++ b/sys/amd64/sgx/sgx.c
@@ -346,13 +346,17 @@ sgx_epc_page_remove(struct sgx_softc *sc,
 }
 
 static void
-sgx_page_remove(struct sgx_softc *sc, vm_page_t p)
+sgx_page_remove(struct sgx_softc *sc, vm_page_t p,
+    struct pctrie_iter *pages)
 {
 	struct epc_page *epc;
 	vm_paddr_t pa;
 	uint64_t offs;
 
-	(void)vm_page_remove(p);
+	if (pages != NULL)
+		(void)vm_page_iter_remove(pages, p);
+	else
+		(void) vm_page_remove(p);
 
 	dprintf("%s: p->pidx %ld\n", __func__, p->pindex);
 
@@ -369,8 +373,9 @@ static void
 sgx_enclave_remove(struct sgx_softc *sc,
     struct sgx_enclave *enclave)
 {
+	struct pctrie_iter pages;
 	vm_object_t object;
-	vm_page_t p, p_secs, p_next;
+	vm_page_t p, p_secs;
 
 	mtx_lock(&sc->mtx);
 	TAILQ_REMOVE(&sc->enclaves, enclave, next);
@@ -378,6 +383,7 @@ sgx_enclave_remove(struct sgx_softc *sc,
 
 	object = enclave->object;
 
+	vm_page_iter_init(&pages, object);
 	VM_OBJECT_WLOCK(object);
 
 	/*
@@ -385,20 +391,21 @@ sgx_enclave_remove(struct sgx_softc *sc,
 	 * then remove SECS page.
 	 */
 restart:
-	TAILQ_FOREACH_SAFE(p, &object->memq, listq, p_next) {
+	VM_RADIX_FOREACH(p, &pages) {
 		if (p->pindex == SGX_SECS_VM_OBJECT_INDEX)
 			continue;
-		if (vm_page_busy_acquire(p, VM_ALLOC_WAITFAIL) == 0)
+		if (vm_page_busy_acquire(p, VM_ALLOC_WAITFAIL) == 0) {
+			pctrie_iter_reset(&pages);
 			goto restart;
-		sgx_page_remove(sc, p);
+		}
+		sgx_page_remove(sc, p, &pages);
 	}
 	p_secs = vm_page_grab(object, SGX_SECS_VM_OBJECT_INDEX,
 	    VM_ALLOC_NOCREAT);
 	/* Now remove SECS page */
 	if (p_secs != NULL)
-		sgx_page_remove(sc, p_secs);
+		sgx_page_remove(sc, p_secs, NULL);
 
-	KASSERT(TAILQ_EMPTY(&object->memq) == 1, ("not empty"));
 	KASSERT(object->resident_page_count == 0, ("count"));
 
 	VM_OBJECT_WUNLOCK(object);
@@ -729,7 +736,7 @@ sgx_ioctl_create(struct sgx_softc *sc, struct sgx_enclave_create *param)
 		p = vm_page_grab(enclave->object,
 		    - SGX_VA_PAGES_OFFS - SGX_SECS_VM_OBJECT_INDEX,
 		    VM_ALLOC_NOCREAT);
-		sgx_page_remove(sc, p);
+		sgx_page_remove(sc, p, NULL);
 		VM_OBJECT_WUNLOCK(object);
 		goto error;
 	}
@@ -743,7 +750,7 @@ sgx_ioctl_create(struct sgx_softc *sc, struct sgx_enclave_create *param)
 		p = vm_page_grab(enclave->object,
 		    - SGX_VA_PAGES_OFFS - SGX_SECS_VM_OBJECT_INDEX,
 		    VM_ALLOC_NOCREAT);
-		sgx_page_remove(sc, p);
+		sgx_page_remove(sc, p, NULL);
 		VM_OBJECT_WUNLOCK(object);
 		goto error;
 	}