git: 92439940517b - main - vm_reserv: find reservations with iterators
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 20 Apr 2025 19:54:18 UTC
The branch main has been updated by dougm: URL: https://cgit.FreeBSD.org/src/commit/?id=92439940517ba57954f6b7f50545a43e506540f1 commit 92439940517ba57954f6b7f50545a43e506540f1 Author: Doug Moore <dougm@FreeBSD.org> AuthorDate: 2025-04-20 19:52:53 +0000 Commit: Doug Moore <dougm@FreeBSD.org> CommitDate: 2025-04-20 19:52:53 +0000 vm_reserv: find reservations with iterators Instead of passing a preceding page to a vm _reserv alloc function, pass an iterator, and use the iterator to find the predecessor and successor. Reviewed by: markj, kib Differential Revision: https://reviews.freebsd.org/D49921 --- sys/vm/vm_page.c | 7 ++++--- sys/vm/vm_reserv.c | 32 +++++++++++++++++--------------- sys/vm/vm_reserv.h | 13 +++++++------ 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index db91b7bab2ab..6601ea23bf0e 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -2182,7 +2182,7 @@ again: * Can we allocate the page from a reservation? */ if (vm_object_reserv(object) && - (m = vm_reserv_alloc_page(object, pindex, domain, req, mpred)) != + (m = vm_reserv_alloc_page(object, pages, pindex, domain, req)) != NULL) { goto found; } @@ -2418,8 +2418,9 @@ vm_page_alloc_contig_domain(vm_object_t object, vm_pindex_t pindex, int domain, * Can we allocate the pages from a reservation? */ if (vm_object_reserv(object) && - (m_ret = vm_reserv_alloc_contig(object, pindex, domain, req, - mpred, npages, low, high, alignment, boundary)) != NULL) { + (m_ret = vm_reserv_alloc_contig(object, &pages, pindex, + domain, req, npages, low, high, alignment, boundary)) != + NULL) { break; } #endif diff --git a/sys/vm/vm_reserv.c b/sys/vm/vm_reserv.c index e553d115a6d4..a562fd80b4a1 100644 --- a/sys/vm/vm_reserv.c +++ b/sys/vm/vm_reserv.c @@ -510,12 +510,13 @@ vm_reserv_from_page(vm_page_t m) * successor pointer. */ static vm_reserv_t -vm_reserv_from_object(vm_object_t object, vm_pindex_t pindex, - vm_page_t mpred, vm_page_t *msuccp) +vm_reserv_from_object(vm_object_t object, struct pctrie_iter *pages, + vm_pindex_t pindex, vm_page_t *mpredp, vm_page_t *msuccp) { vm_reserv_t rv; - vm_page_t msucc; + vm_page_t mpred, msucc; + mpred = vm_radix_iter_lookup_lt(pages, pindex); if (mpred != NULL) { KASSERT(mpred->object == object, ("vm_reserv_from_object: object doesn't contain mpred")); @@ -524,9 +525,9 @@ vm_reserv_from_object(vm_object_t object, vm_pindex_t pindex, rv = vm_reserv_from_page(mpred); if (rv->object == object && vm_reserv_has_pindex(rv, pindex)) return (rv); - msucc = TAILQ_NEXT(mpred, listq); - } else - msucc = TAILQ_FIRST(&object->memq); + } + + msucc = vm_radix_iter_lookup_ge(pages, pindex); if (msucc != NULL) { KASSERT(msucc->pindex > pindex, ("vm_reserv_from_object: msucc doesn't succeed pindex")); @@ -534,6 +535,7 @@ vm_reserv_from_object(vm_object_t object, vm_pindex_t pindex, if (rv->object == object && vm_reserv_has_pindex(rv, pindex)) return (rv); } + *mpredp = mpred; *msuccp = msucc; return (NULL); } @@ -683,13 +685,13 @@ vm_reserv_populate(vm_reserv_t rv, int index) * The object must be locked. */ vm_page_t -vm_reserv_alloc_contig(vm_object_t object, vm_pindex_t pindex, int domain, - int req, vm_page_t mpred, u_long npages, vm_paddr_t low, vm_paddr_t high, - u_long alignment, vm_paddr_t boundary) +vm_reserv_alloc_contig(vm_object_t object, struct pctrie_iter *pages, + vm_pindex_t pindex, int domain, int req, u_long npages, vm_paddr_t low, + vm_paddr_t high, u_long alignment, vm_paddr_t boundary) { struct vm_domain *vmd; vm_paddr_t pa, size; - vm_page_t m, m_ret, msucc; + vm_page_t m, m_ret, mpred, msucc; vm_pindex_t first; vm_reserv_t rv; u_long allocpages; @@ -723,7 +725,7 @@ vm_reserv_alloc_contig(vm_object_t object, vm_pindex_t pindex, int domain, /* * Look for an existing reservation. */ - rv = vm_reserv_from_object(object, pindex, mpred, &msucc); + rv = vm_reserv_from_object(object, pages, pindex, &mpred, &msucc); if (rv != NULL) { KASSERT(object != kernel_object || rv->domain == domain, ("vm_reserv_alloc_contig: domain mismatch")); @@ -830,11 +832,11 @@ out: * The object must be locked. */ vm_page_t -vm_reserv_alloc_page(vm_object_t object, vm_pindex_t pindex, int domain, - int req, vm_page_t mpred) +vm_reserv_alloc_page(vm_object_t object, struct pctrie_iter *pages, + vm_pindex_t pindex, int domain, int req) { struct vm_domain *vmd; - vm_page_t m, msucc; + vm_page_t m, mpred, msucc; vm_pindex_t first; vm_reserv_t rv; int index; @@ -851,7 +853,7 @@ vm_reserv_alloc_page(vm_object_t object, vm_pindex_t pindex, int domain, /* * Look for an existing reservation. */ - rv = vm_reserv_from_object(object, pindex, mpred, &msucc); + rv = vm_reserv_from_object(object, pages, pindex, &mpred, &msucc); if (rv != NULL) { KASSERT(object != kernel_object || rv->domain == domain, ("vm_reserv_alloc_page: domain mismatch")); diff --git a/sys/vm/vm_reserv.h b/sys/vm/vm_reserv.h index 98780efc9d37..1dcf09e6c736 100644 --- a/sys/vm/vm_reserv.h +++ b/sys/vm/vm_reserv.h @@ -45,12 +45,13 @@ /* * The following functions are only to be used by the virtual memory system. */ -vm_page_t vm_reserv_alloc_contig(vm_object_t object, vm_pindex_t pindex, - int domain, int req, vm_page_t mpred, u_long npages, - vm_paddr_t low, vm_paddr_t high, u_long alignment, - vm_paddr_t boundary); -vm_page_t vm_reserv_alloc_page(vm_object_t object, vm_pindex_t pindex, - int domain, int req, vm_page_t mpred); +vm_page_t vm_reserv_alloc_contig(vm_object_t object, + struct pctrie_iter *pages, vm_pindex_t pindex, int domain, + int req, u_long npages, vm_paddr_t low, vm_paddr_t high, + u_long alignment, vm_paddr_t boundary); +vm_page_t vm_reserv_alloc_page(vm_object_t object, + struct pctrie_iter *pages, vm_pindex_t pindex, int domain, + int req); void vm_reserv_break_all(vm_object_t object); boolean_t vm_reserv_free_page(vm_page_t m); void vm_reserv_init(void);