From nobody Sun Apr 20 19:54:18 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ZgfMt3wcMz5tYR6; Sun, 20 Apr 2025 19:54:18 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZgfMt2VS3z3r3c; Sun, 20 Apr 2025 19:54:18 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745178858; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=tr0SGZYjfv2q+LhGMRXuYdRtSUPbK917489USULLJvU=; b=nQsM3YXPkyOjCxcEAvm55P3fUfBq+0+xbkKC2YLkZyw8fIRLDcDipv/ADbqlIHO0AAt6oA WM2IXmFkWitJjnBc5V8SCw4Wh+WKFubQKUZrl1Nzckz1iIOgiQmJ4Jf3yCuKhMD4oiFuEm f+kWXJDSeHvfgYHjZb9BHYR0fr0owI/wnfUCzmngsGzetsN0QK0SWKe7fRqT4fPLIyjEVr oUrNKgzQ4kiFF/ee8WTL7+Ngj/solGFZou9PzOVioFqqmJfmQAYOtbTzpIs6FI/uygJfZm s29qfFYII/gX4iy6biph8y0DBBs/RCz4dAZ7RLlqF286CR5KCA14MpZPVq+qlg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1745178858; a=rsa-sha256; cv=none; b=ycptIOo2DMBQ/m73OI/MNpHaHTXRzMaaj8exGk6pLbnx10IMLZc2CSz3z7ez4iedAZ0kg/ U1ypiurKWs+K49aZI7jeGfG+MhnI/ETDxVq+SHmWXSm3l7PAKH5JnCbda+DZ5POqyn8klu ZHggn80FYzQV6EmLvh0boPKXYadGEp+kQV8W2cZtAiISmf5nlpUVtLJxOT56Z9L2vfXxpe IBOLR/XRSBeoNtSOVe9rR9RIbGfMZ2yiXbU0sPtaql7aQM/oV2aScTqHK2CZRIREgTiXLp Uq4G93r1uVFHTobbRVc/ZcXVy3ZDsFVJcZ91DJQ8FWmv0YJvgxX1/xCC+A85GQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745178858; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=tr0SGZYjfv2q+LhGMRXuYdRtSUPbK917489USULLJvU=; b=Xeh8hnwPuJ8BEL33VEiTRHI6FiQTJUI+Xj5jr3v26mOYUl3OT+fHkrfv4lL+D6Z9BUUTf1 M7oS9h5xe63kVWdpt8dxxipQiyNJeUN16CtJabqVm5h5+tpE4xltH7ohAsPbkgBRw0Qx2n oe0pszltRTGAYqjCWH2lQ1JEhodf2rulsnnCYEREs7IeEK+0+FSJZ9cCC3P+gMu1+eNnmv NgbTYkac/fm0tIL3U00b51xGRIrUsg9vKgGyqDftPABxDwhOBkqb+KEfarI3W9G7Y00gea Y+Y4t9IhohZCMWhJJH3ZhsSvteiVK2JFl3RhA0CLPcL8kGIQX7MCtsCPcdwHmQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZgfMt1r4xz2w9; Sun, 20 Apr 2025 19:54:18 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 53KJsInL078875; Sun, 20 Apr 2025 19:54:18 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53KJsIDU078872; Sun, 20 Apr 2025 19:54:18 GMT (envelope-from git) Date: Sun, 20 Apr 2025 19:54:18 GMT Message-Id: <202504201954.53KJsIDU078872@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Doug Moore Subject: git: 92439940517b - main - vm_reserv: find reservations with iterators List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dougm X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 92439940517ba57954f6b7f50545a43e506540f1 Auto-Submitted: auto-generated The branch main has been updated by dougm: URL: https://cgit.FreeBSD.org/src/commit/?id=92439940517ba57954f6b7f50545a43e506540f1 commit 92439940517ba57954f6b7f50545a43e506540f1 Author: Doug Moore AuthorDate: 2025-04-20 19:52:53 +0000 Commit: Doug Moore 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);