git: d2acf0a44709 - main - swap_pager: pctrie_reclaim_cb in meta_free_all

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Thu, 13 Jun 2024 18:52:47 UTC
The branch main has been updated by dougm:

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

commit d2acf0a447093dcf0805c75490e1cd989bc8c36c
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2024-06-13 18:47:54 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2024-06-13 18:52:25 +0000

    swap_pager: pctrie_reclaim_cb in meta_free_all
    
    Replace the lookup-remove loop in swp_pager_meta_free_all with a call
    to SWAP_PCTRIE_RECLAIM_CALLBACK, to eliminate repeated trie searches.
    
    Reviewed by:    rlibby
    Differential Revision:  https://reviews.freebsd.org/D45583
---
 sys/vm/swap_pager.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 3bfda3eea169..c339f70ddea1 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -2220,8 +2220,11 @@ swp_pager_meta_free(vm_object_t object, vm_pindex_t pindex, vm_pindex_t count,
 }
 
 static void
-swp_pager_meta_free_block(struct swblk *sb, struct page_range *range)
+swp_pager_meta_free_block(void *sbv, void *rangev)
 {
+	struct swblk *sb = sbv;
+	struct page_range *range = rangev;
+
 	for (int i = 0; i < SWAP_META_PAGES; i++) {
 		if (sb->d[i] != SWAPBLK_NONE)
 			swp_pager_update_freerange(range, sb->d[i]);
@@ -2238,19 +2241,13 @@ swp_pager_meta_free_block(struct swblk *sb, struct page_range *range)
 static void
 swp_pager_meta_free_all(vm_object_t object)
 {
-	struct swblk *sb;
 	struct page_range range;
-	vm_pindex_t pindex;
 
 	VM_OBJECT_ASSERT_WLOCKED(object);
 
 	swp_pager_init_freerange(&range);
-	for (pindex = 0; (sb = SWAP_PCTRIE_LOOKUP_GE(
-	    &object->un_pager.swp.swp_blks, pindex)) != NULL;) {
-		pindex = sb->p + SWAP_META_PAGES;
-		SWAP_PCTRIE_REMOVE(&object->un_pager.swp.swp_blks, sb->p);
-		swp_pager_meta_free_block(sb, &range);
-	}
+	SWAP_PCTRIE_RECLAIM_CALLBACK(&object->un_pager.swp.swp_blks,
+	    swp_pager_meta_free_block, &range);
 	swp_pager_freeswapspace(&range);
 }