git: b3d89a0cde94 - main - vm_map: use page iterators in pmap_enter
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 18 Apr 2025 23:38:56 UTC
The branch main has been updated by dougm: URL: https://cgit.FreeBSD.org/src/commit/?id=b3d89a0cde94b22ce1b4ca620b77986291137132 commit b3d89a0cde94b22ce1b4ca620b77986291137132 Author: Doug Moore <dougm@FreeBSD.org> AuthorDate: 2025-04-18 23:37:49 +0000 Commit: Doug Moore <dougm@FreeBSD.org> CommitDate: 2025-04-18 23:37:49 +0000 vm_map: use page iterators in pmap_enter Change vm_map_pmap_enter to use pctrie iterators to iterate over pages, rather than using TAILQ links. Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D49896 --- sys/vm/vm_map.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 564ef59950e4..0371680f6df5 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -89,6 +89,7 @@ #include <vm/vm_pageout.h> #include <vm/vm_object.h> #include <vm/vm_pager.h> +#include <vm/vm_radix.h> #include <vm/vm_kern.h> #include <vm/vm_extern.h> #include <vm/vnode_pager.h> @@ -2674,6 +2675,7 @@ static void vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot, vm_object_t object, vm_pindex_t pindex, vm_size_t size, int flags) { + struct pctrie_iter pages; vm_offset_t start; vm_page_t p, p_start; vm_pindex_t mask, psize, threshold, tmpidx; @@ -2706,19 +2708,14 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot, p_start = NULL; threshold = MAX_INIT_PT; - p = vm_page_find_least(object, pindex); - /* - * Assert: the variable p is either (1) the page with the - * least pindex greater than or equal to the parameter pindex - * or (2) NULL. - */ - for (; - p != NULL && (tmpidx = p->pindex - pindex) < psize; - p = TAILQ_NEXT(p, listq)) { + vm_page_iter_limit_init(&pages, object, pindex + psize); + for (p = vm_radix_iter_lookup_ge(&pages, pindex); p != NULL; + p = vm_radix_iter_jump(&pages, mask + 1)) { /* * don't allow an madvise to blow away our really * free pages allocating pv entries. */ + tmpidx = p->pindex - pindex; if (((flags & MAP_PREFAULT_MADVISE) != 0 && vm_page_count_severe()) || ((flags & MAP_PREFAULT_PARTIAL) != 0 && @@ -2726,6 +2723,7 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot, psize = tmpidx; break; } + mask = 0; if (vm_page_all_valid(p)) { if (p_start == NULL) { start = addr + ptoa(tmpidx); @@ -2739,7 +2737,6 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot, if (tmpidx + mask < psize && vm_page_ps_test(p, psind, PS_ALL_VALID, NULL)) { - p += mask; threshold += mask; break; }