git: b7631876399c - main - vm _radix: define foreach macros for walking pages

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

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

commit b7631876399c1d3eff3553778964f141ad1a5e4d
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-04-18 15:42:35 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-04-18 15:42:35 +0000

    vm _radix: define foreach macros for walking pages
    
    Define VM_RADIX_FOREACH to be TAILQ free equivalent of TAIL_FOREACH,
    and VM_RADIX_FORALL for walking consecutive pages.
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D49881
---
 sys/vm/vm_radix.h | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/sys/vm/vm_radix.h b/sys/vm/vm_radix.h
index e9ee3e7f3911..49ea16079d2b 100644
--- a/sys/vm/vm_radix.h
+++ b/sys/vm/vm_radix.h
@@ -257,6 +257,18 @@ vm_radix_iter_step(struct pctrie_iter *pages)
 	return (VM_RADIX_PCTRIE_ITER_STEP_GE(pages));
 }
 
+/*
+ * Iterate over each non-NULL page from page 'start' to the end of the object.
+ */
+#define VM_RADIX_FOREACH_FROM(m, pages, start)				\
+	for (m = vm_radix_iter_lookup_ge(&pages, start); m != NULL;	\
+	    m = vm_radix_iter_step(&pages))
+
+/*
+ * Iterate over each non-NULL page from the beginning to the end of the object.
+ */
+#define VM_RADIX_FOREACH(m, pages) VM_RADIX_FOREACH_FROM(m, pages, 0)
+
 /*
  * Initialize an iterator pointing to the page with the greatest pindex that is
  * less than or equal to the specified pindex, or NULL if there are no such
@@ -295,6 +307,20 @@ vm_radix_iter_next(struct pctrie_iter *pages)
 	return (VM_RADIX_PCTRIE_ITER_NEXT(pages));
 }
 
+/*
+ * Iterate over consecutive non-NULL pages from position 'start' to first NULL
+ * page.
+ */
+#define VM_RADIX_FORALL_FROM(m, pages, start)				\
+	for (m = vm_radix_iter_lookup(&pages, start); m != NULL;	\
+	    m = vm_radix_iter_next(&pages))
+
+/*
+ * Iterate over consecutive non-NULL pages from the beginning to first NULL
+ * page.
+ */
+#define VM_RADIX_FORALL(m, pages) VM_RADIX_FORALL_FROM(m, pages, 0)
+
 /*
  * Update the iterator to point to the page with the pindex that is one less
  * than the current pindex, or NULL if there is no such page.  Return the page.