git: 14efeab6adba - main - vm_grab: reset iter after alloc failure

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Thu, 10 Apr 2025 07:09:50 UTC
The branch main has been updated by dougm:

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

commit 14efeab6adbabe95f3b18f00d02dae550dbfc7f3
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-04-10 07:06:38 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-04-10 07:06:38 +0000

    vm_grab: reset iter after alloc failure
    
    After vm_page_grab_lookup fails to find a page, and
    vm_page_alloc_after fails to allocate one, reset the pages iterator
    which is invalidated by a release/acquire of the object write lock
    within the allocation code.
    
    Reported by:    pho
    Reviewed by:    kib
    Fixes:  7becd87c988c ("vm_grab: use iterator for grab lookup")
    Differential Revision:  https://reviews.freebsd.org/D49755
---
 sys/vm/vm_page.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index f9653f1d1ec9..741c45490d96 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -4882,6 +4882,7 @@ vm_page_grab(vm_object_t object, vm_pindex_t pindex, int allocflags)
 		if ((allocflags &
 		    (VM_ALLOC_NOWAIT | VM_ALLOC_WAITFAIL)) != 0)
 			return (NULL);
+		pctrie_iter_reset(&pages);
 	}
 	vm_page_grab_release(m, allocflags);
 
@@ -5124,6 +5125,7 @@ vm_page_grab_zero_partial(vm_object_t object, vm_pindex_t pindex, int base,
 			vm_page_launder(m);
 			break;
 		}
+		pctrie_iter_reset(&pages);
 	}
 
 	pmap_zero_page_area(m, base, end - base);