From nobody Sun May 3 15:45:46 2026 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 4g7pyg37Bjz6W2yk for ; Sun, 03 May 2026 15:45:47 +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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g7pyg02mdz3Jd1 for ; Sun, 03 May 2026 15:45:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777823147; 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=DZ9N+C+OCI1ID2rxjdScdCZRmbwH/kKKi7T3DlM9T9k=; b=HWbfkteQyZShgbAfPxqLJSADyzxjwF1ytfSoBm9P4aUT8Wfv5Y0YbxEK5YCGqqYpqvUB2H /q6T8ynKNEnKM73UZRgJLHjhSKikhZNZJds5J5e/AkLiNEDBIeSS5+qJx9jgGYiHw8jeb1 2KaWrjEWdZo9dvAKMFcKF61HgUxQj99P85XHVmxtV3/IdO/U41oun4XxZCniRDH3Qz1cr+ elnFzVuJxn/DpU4VckwwE3IYTfob1ot+sXXaFiBQdcPp4vm+spcQAhauu+5pf+7Yet4FIr i/3yG7xPzcHGAq/ZfuVEIMdcLx1/k+mPMUvS/47xASSOyN3UTs4Abb3HMpjvPg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777823147; a=rsa-sha256; cv=none; b=n9tBFffdqIyiY6EMv9jN1eVwNHa4b3ZJjCv3ObmicfJKuYrUqySYU85xRc1JyJv8JumuC1 TN7amGWO7g0oaoIF3jMzozhePEM39obrFiqTzuTTiP2yu5A9N8xmigU1pyvf1E2mswHQ25 1mvCAS4/6pOPFtUTt8Zx12glf7wmQc3naJGikDfeTHSyNQfDGVQG9EyEorVEU/kajA7DgM Ba4SG4D7U6oJ9XPALi/awXE58dJwd8mFTVsZDS4HetxQtyiartrIE9mbZ2eOo/xKQNkXqa 0d6Ac+mZM3XyW0Yrt04DJ3bTlYsMSFbo6R+w3kIzcYfuHXpSTfbQsBlsGVMaXQ== 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=1777823147; 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=DZ9N+C+OCI1ID2rxjdScdCZRmbwH/kKKi7T3DlM9T9k=; b=DP5s65XUR8ED4GSj8bKshyPEf3BoI3rbYAxF2+xBSGNsM68EYOLIOSaOOp9xpB9kTfDTDY 013eohLgbmOooaARNFoKioxYJRQ4vPLgR8hWVNPd4mJSp0kWs+SIEaPawB9m99wRyBN8ct UNE3WZ6iAkBTo8LD9sCiP/ISejd0uguNWfPefEqj/rgutrme+/hxfy/FIOvQlnvJEBp4p+ HIwkrONerwWORObjScZsdA+ZWwCjSFb46hIQjk/1s1gIExz9QaLTFbCkES7Znr8c7z6A23 yLOQwxfb2ludWG4s6peEDt1+PpMuxLArBCvtAbrOm++AjfHAxDU9/w6EligZxw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g7pyf6mBGzfrD for ; Sun, 03 May 2026 15:45:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1e6aa by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 03 May 2026 15:45:46 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: 49dbebd74fc8 - stable/15 - epoch: Don't idle CPUs when there's pending epoch work 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 List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list 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/15 X-Git-Reftype: branch X-Git-Commit: 49dbebd74fc890b4b91bb5abe65aba7a9ecbdb7b Auto-Submitted: auto-generated Date: Sun, 03 May 2026 15:45:46 +0000 Message-Id: <69f76daa.1e6aa.6d87144@gitrepo.freebsd.org> The branch stable/15 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=49dbebd74fc890b4b91bb5abe65aba7a9ecbdb7b commit 49dbebd74fc890b4b91bb5abe65aba7a9ecbdb7b Author: Mark Johnston AuthorDate: 2026-04-21 14:28:31 +0000 Commit: Mark Johnston CommitDate: 2026-05-03 14:52:22 +0000 epoch: Don't idle CPUs when there's pending epoch work The epoch(9) subsystem implements per-CPU queues of object destructors which get invoked once it is safe to do so. These queues are polled via hardclock(). When a CPU is about to go idle, we reduce the hardclock frequency to 1Hz by default, to avoid unneeded wakeups. This means that if there is any garbage in these destructor queues, it won't be cleared for at least 1s (and possibly longer) even if it would otherwise be safe to do so. epoch_drain_callbacks() is used in some places to provide a barrier, ensuring that all garbage present in the destructor queues is cleaned up before returning. It's implemented by adding a fake destructor in the queues and blocking until it gets run on all CPUs. The above-described phenomenon means that it can take a long time for these calls to return, even (especially) when some CPUs are idle. This causes long delays when destroying VNET jails, for instance, as epoch_drain_callbacks() is invoked each time a network interface is destroyed. Work around this problem by not disabling the hardclock timer if there is garbage present in the destructor queues. The implementation of epoch_drain_callbacks() has other problems, but this small change on its own gives a good improvement, especially when running networking regression tests. Moreover, we should aim to invoke destructors in a timely manner, so the change is generally beneficial. Reviewed by: glebius MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D56508 (cherry picked from commit dce56594991464c276f340ce963d0f5461566c78) --- sys/kern/kern_clocksource.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/kern/kern_clocksource.c b/sys/kern/kern_clocksource.c index 6bf3bbd83245..637610654648 100644 --- a/sys/kern/kern_clocksource.c +++ b/sys/kern/kern_clocksource.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -235,7 +236,7 @@ getnextcpuevent(struct pcpu_state *state, int idle) /* Handle hardclock() events, skipping some if CPU is idle. */ event = state->nexthard; - if (idle) { + if (idle && DPCPU_GET(epoch_cb_count) == 0) { if (tc_min_ticktock_freq > 1 #ifdef SMP && curcpu == CPU_FIRST()