From nobody Thu Jul 10 21:04:13 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 4bdS5B089zz61YVb; Thu, 10 Jul 2025 21:04:14 +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 4bdS596TkKz44TW; Thu, 10 Jul 2025 21:04:13 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1752181453; 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=fnQAuTmxd3QZu0SVwOq6NJ16DDkxqmmSAD3YLF/C1GM=; b=vaHfUVXT5frkskbwwEnzAtxhrzRtPz76lhLEZZYmILCk5/jPw0lkuguhnMzQ7fThskX61a 0wuG9vXD3G50M13i9K2L09loeYELb2+QnX5w/anGcoo/ijC2VSFc9VTy5M9L/gV77+wkND p7l16+QP1VW+aTX3kqV7eZSNhIPmcHR6I5uq7p37sqRYgN0WQaQaUzOax/VCxq0YSIQmAj 6FERXIlC3zzjn4g5BlXZ9PKIUnPr9g//fJinHkTEjiGQAeJxEhRkcM/PqVzRg4ENWk8HjP ++9rLm9N0XCciBTZ1ufJxICjxHUrx3IZaV/k31JVE62UMa+83EpYD3WFJp/Duw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1752181453; 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=fnQAuTmxd3QZu0SVwOq6NJ16DDkxqmmSAD3YLF/C1GM=; b=lr5xwSUF5QTJwZQxhDkmPoZgh5Dl8X7MxI8XT25Rrv8SqOgcXdF+By/71L7yxcZ9R4gZ/l WY/F/rsJI7Jy8LcBpJcz2otQGLQAkMV5XpiunYI9hFDjMb3igiFtHrBUoFR2p7Ak6cnydN aDbOb16Vl43okpqyMCTusD8V5vmBMUHvMZQIrT3c39x9M1PI1PPqvtb7W1Dwvehs6gHFsR eCpgMOIDZPOGB68DKMYAr/QjRTmvrrMLPxVR1gLb7x49kvsXkx9FYjANR1M1rLS0zIk0Hx zBpwsOgstrP7yy1iig1kOwUmXhpEEmsypCeBxytloWVyFYJJ7D3HIYme6fwykQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1752181453; a=rsa-sha256; cv=none; b=Va9+7zj6uCGEstPmKsuK8XycjzfmWmkkuadHKBcCoxlr2mZrG27+zgd81Oq1Cc753lqahy sEdmD9HdWIGtAZwc6nw0j7yyl7mWPsXoVxd+ZuAmt2zdwatoY1NpfS5UCJd3BAWYgz/wfc efUgHVvgoILxAue4Vh4ATLbz2OBdrJB3ozpW69fUV5rEZ4FlMOyn/fJrHlqg390r5mqw+9 Kqf9X+uXJVfVJYj8K4yXf28hwO1tyceaVf/gxMP0DVr6ew+/8L+bZu4nDDPeHFCiK4lTYy AADWY17gBdNB9ljDndguP97CcJzxVKzkf/IPI3rDlFwdBus903O4ktgfNZkpgw== 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 4bdS596111z1MGw; Thu, 10 Jul 2025 21:04:13 +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 56AL4DPr028593; Thu, 10 Jul 2025 21:04:13 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 56AL4DB5028590; Thu, 10 Jul 2025 21:04:13 GMT (envelope-from git) Date: Thu, 10 Jul 2025 21:04:13 GMT Message-Id: <202507102104.56AL4DB5028590@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: 103763fab4f7 - stable/14 - vm_pageout_scan_inactive: take a lock break 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: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 103763fab4f7349df53f7367816f1f4ca2881005 Auto-Submitted: auto-generated The branch stable/14 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=103763fab4f7349df53f7367816f1f4ca2881005 commit 103763fab4f7349df53f7367816f1f4ca2881005 Author: Ryan Libby AuthorDate: 2024-05-24 15:52:58 +0000 Commit: Mark Johnston CommitDate: 2025-07-10 21:00:34 +0000 vm_pageout_scan_inactive: take a lock break In vm_pageout_scan_inactive, release the object lock when we go to refill the scan batch queue so that someone else has a chance to acquire it. This improves access latency to the object when the pagedaemon is processing many consecutive pages from a single object, and also in any case avoids a hiccup during refill for the last touched object. Reviewed by: alc, markj (previous version) Sponsored by: Dell EMC Isilon Differential Revision: https://reviews.freebsd.org/D45288 (cherry picked from commit a216e311a70cc87a5646f4306e36c60a51706699) --- sys/vm/vm_pageout.c | 16 +++++++++++++++- sys/vm/vm_pagequeue.h | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index c2c5281b87af..83f655eb852e 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -1468,7 +1468,21 @@ vm_pageout_scan_inactive(struct vm_domain *vmd, int page_shortage) pq = &vmd->vmd_pagequeues[PQ_INACTIVE]; vm_pagequeue_lock(pq); vm_pageout_init_scan(&ss, pq, marker, NULL, pq->pq_cnt); - while (page_shortage > 0 && (m = vm_pageout_next(&ss, true)) != NULL) { + while (page_shortage > 0) { + /* + * If we need to refill the scan batch queue, release any + * optimistically held object lock. This gives someone else a + * chance to grab the lock, and also avoids holding it while we + * do unrelated work. + */ + if (object != NULL && vm_batchqueue_empty(&ss.bq)) { + VM_OBJECT_WUNLOCK(object); + object = NULL; + } + + m = vm_pageout_next(&ss, true); + if (m == NULL) + break; KASSERT((m->flags & PG_MARKER) == 0, ("marker page %p was dequeued", m)); diff --git a/sys/vm/vm_pagequeue.h b/sys/vm/vm_pagequeue.h index 70122fef9fff..43cb67a252b5 100644 --- a/sys/vm/vm_pagequeue.h +++ b/sys/vm/vm_pagequeue.h @@ -357,6 +357,12 @@ vm_batchqueue_init(struct vm_batchqueue *bq) bq->bq_cnt = 0; } +static inline bool +vm_batchqueue_empty(const struct vm_batchqueue *bq) +{ + return (bq->bq_cnt == 0); +} + static inline int vm_batchqueue_insert(struct vm_batchqueue *bq, vm_page_t m) {