The branch main has been updated by dougm:

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

commit 14efeab6adbabe95f3b18f00d02dae550dbfc7f3
Author:     Doug Moore <do...@freebsd.org>
AuthorDate: 2025-04-10 07:06:38 +0000
Commit:     Doug Moore <do...@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);

Reply via email to