git: 76c60597fa2a - main - swap_pager: use vm_page_iterators for lookup

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Sat, 28 Sep 2024 21:47:46 UTC
The branch main has been updated by dougm:

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

commit 76c60597fa2af9ec5b5a24305794b70ad1530755
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2024-09-28 21:46:40 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2024-09-28 21:46:40 +0000

    swap_pager: use vm_page_iterators for lookup
    
    Replace the use of page lookups and page next pointers in swap_pager.c
    with vm_page iterators.
    
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D46704
---
 sys/vm/swap_pager.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index aa0297daefe9..fbf2967aaf17 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -1856,6 +1856,7 @@ swap_pager_swapped_pages(vm_object_t object)
 static void
 swap_pager_swapoff_object(struct swdevt *sp, vm_object_t object)
 {
+	struct pctrie_iter pages;
 	struct page_range range;
 	struct swblk *sb;
 	vm_page_t m;
@@ -1870,6 +1871,7 @@ swap_pager_swapoff_object(struct swdevt *sp, vm_object_t object)
 
 	pi = 0;
 	i = 0;
+	vm_page_iter_init(&pages, object);
 	swp_pager_init_freerange(&range);
 	for (;;) {
 		if (i == 0 && (object->flags & OBJ_DEAD) != 0) {
@@ -1896,7 +1898,6 @@ swap_pager_swapoff_object(struct swdevt *sp, vm_object_t object)
 			if (sb == NULL)
 				break;
 			sb_empty = true;
-			m = NULL;
 		}
 
 		/* Skip an invalid block. */
@@ -1904,7 +1905,6 @@ swap_pager_swapoff_object(struct swdevt *sp, vm_object_t object)
 		if (blk == SWAPBLK_NONE || !swp_pager_isondev(blk, sp)) {
 			if (blk != SWAPBLK_NONE)
 				sb_empty = false;
-			m = NULL;
 			i++;
 			continue;
 		}
@@ -1913,8 +1913,7 @@ swap_pager_swapoff_object(struct swdevt *sp, vm_object_t object)
 		 * Look for a page corresponding to this block, If the found
 		 * page has pending operations, sleep and restart the scan.
 		 */
-		m = m != NULL ? vm_page_next(m) :
-		    vm_page_lookup(object, sb->p + i);
+		m = vm_page_iter_lookup(&pages, sb->p + i);
 		if (m != NULL && (m->oflags & VPO_SWAPINPROG) != 0) {
 			m->oflags |= VPO_SWAPSLEEP;
 			VM_OBJECT_SLEEP(object, &object->handle, PSWP, "swpoff",
@@ -2272,6 +2271,7 @@ static void
 swp_pager_meta_free(vm_object_t object, vm_pindex_t pindex, vm_pindex_t count,
     vm_size_t *freed)
 {
+	struct pctrie_iter pages;
 	struct page_range range;
 	struct swblk *sb;
 	vm_page_t m;
@@ -2282,11 +2282,11 @@ swp_pager_meta_free(vm_object_t object, vm_pindex_t pindex, vm_pindex_t count,
 	VM_OBJECT_ASSERT_WLOCKED(object);
 
 	fc = 0;
-	m = NULL;
 	if (count == 0 || swblk_is_empty(object))
 		goto out;
 
 	swp_pager_init_freerange(&range);
+	vm_page_iter_init(&pages, object);
 	last = pindex + count;
 	sb = swblk_start_limit(object, pindex, last);
 	start = (sb != NULL && sb->p < pindex) ? pindex - sb->p : 0;
@@ -2298,9 +2298,7 @@ swp_pager_meta_free(vm_object_t object, vm_pindex_t pindex, vm_pindex_t count,
 				continue;
 			swp_pager_update_freerange(&range, sb->d[i]);
 			if (freed != NULL) {
-				m = (m != NULL && m->pindex == sb->p + i - 1) ?
-				    vm_page_next(m) :
-				    vm_page_lookup(object, sb->p + i);
+				m = vm_page_iter_lookup(&pages, sb->p + i);
 				if (m == NULL || vm_page_none_valid(m))
 					fc++;
 			}