From nobody Mon Jul 28 13:31:45 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 4brKBn74NMz63547; Mon, 28 Jul 2025 13:31:45 +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 4brKBn1YVMz3vV9; Mon, 28 Jul 2025 13:31:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1753709505; 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=EY9Md8ZW/1aantgWMIe62+L+p1Do3u44r0neqYwedQU=; b=MLPBYBOntNtktAhW0pa3q0TxTPLIb/hNP9wdSJ9Ob+iL+JB6Cb+7wQKQyUpErxqy4FkMqi 3fT6uleLqCwXMc5X52OPjGOH78aaqpxQvNSv+Zwpls+1TCqJ7uJNrdTaV5AFZh3wLEphyC SCp+B7ZjVWMIddOr/YZlwpq132gGWm9gCR0ojC3G5ibdT6HZCJn6zZ39PGtmcjfiKFzjS9 F3Fl5B8I+WgV4r2v+aLoPp2PAUHYrRWeIFC/QAeJi8KImmUOcVX4rLMLGguDY0xDeixX28 hK8Hw6ry/jqNEpcqi+lRFE0eQ+jHOD/HoFuU7k57WRZLOdBbVc5jNj9aSC27ug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1753709505; 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=EY9Md8ZW/1aantgWMIe62+L+p1Do3u44r0neqYwedQU=; b=XDQt/pDhnAqOqckFkkhesJvK6D7cYU5f9IHhRFa6mOf4Vo/RytT0BHNQjCV1BmvvjdY7dT wr4PkzuhkurS8Oq3HwEvAoFxuNXlKEdjxhEjgKylPAT1SxCLlMYUT9yB/Q9+P/VAP050Xv LUQCaSOeP6F/JR5biGVPKDbUmrhkPqTevUh+S9/pss9xDPr0RPQ1ObT1vRUKTD+ilpFAc4 AzCybYShyWpF939hLTvhGMZ4QYRL+s/9x4oELuXWnGmMzUIJKd/RqUs8KWTLPRTkNbyuJ8 nedIRBef6VZvfdVv1Uox4iK4UpNO5AxzW9DF+yvfEOKssxNZX5H7gpoJvw/fzw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1753709505; a=rsa-sha256; cv=none; b=Mh/uAEvJT257VpNllWmQ+bqND3UxF2mdkdUQQ+0bPwMpZvo5uunuSekaLQ0Gi77EAifsvp Zpz+7wERF1LvluqYfORK2IHdP8HeJELOl8JlWgisttvl+UuqqX6i8s7UVE/iHUo0qV7ZHm 5h1vb7My3Lj1Cp9q98eywRljDIgjWWJx7ixmUDQiQBrVZicucESEumcpUkl2Zh4vdJX+GI 2F3ASxQ/2eBcvulFmyYmLrOVDWvgui5Bnf9ZyDGOq2OAmg6NNQAmbKTpeIuylqykPfR1Nc zEhLNY9EYbTy4GBA0+6ClFG0oDdlHng6fx7gVUd9NopK4IKEUQp9lNGTVRtp2A== 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 4brKBn0XGfznvN; Mon, 28 Jul 2025 13:31:45 +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 56SDVjfl082330; Mon, 28 Jul 2025 13:31:45 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 56SDVj5j082327; Mon, 28 Jul 2025 13:31:45 GMT (envelope-from git) Date: Mon, 28 Jul 2025 13:31:45 GMT Message-Id: <202507281331.56SDVj5j082327@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Olivier Certner Subject: git: 2d2e8ea9f286 - stable/14 - runq: runq_not_empty() to support racy lookups again 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: olce X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 2d2e8ea9f2866182ad1524b5b99564a46f92649f Auto-Submitted: auto-generated The branch stable/14 has been updated by olce: URL: https://cgit.FreeBSD.org/src/commit/?id=2d2e8ea9f2866182ad1524b5b99564a46f92649f commit 2d2e8ea9f2866182ad1524b5b99564a46f92649f Author: Olivier Certner AuthorDate: 2025-06-20 02:36:09 +0000 Commit: Olivier Certner CommitDate: 2025-07-28 13:28:47 +0000 runq: runq_not_empty() to support racy lookups again The 4BSD assumes that its sched_runnable(), which then calls runq_not_empty(), can be called racily (another CPU may be grabbing a thread from the global queue at the same time). This makes runq_not_empty() trip on an assertion in runq_find() detecting a mismatch between some bit in the status word and the state of the corresponding queue (empty/not empty). Re-implement runq_not_empty() in an independent and simpler way as an alternative to removing the assertion, which remains useful to detect races when removing or adding a thread in some runqueue. Fixes: 79f68322c892 ("runq: runq_check(): Re-implement on top of runq_findq()") MFC after: 1 month Event: Kitchener-Waterloo Hackathon 202506 Sponsored by: The FreeBSD Foundation (cherry picked from commit be8e84c2e9240110ce99bb8d14259073340e4ef6) --- sys/kern/kern_switch.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/sys/kern/kern_switch.c b/sys/kern/kern_switch.c index 917f73682564..42fee61a99a0 100644 --- a/sys/kern/kern_switch.c +++ b/sys/kern/kern_switch.c @@ -493,7 +493,7 @@ int runq_findq(struct runq *const rq, const int lvl_min, const int lvl_max, runq_pred_t *const pred, void *const pred_data) { - rqsw_t const (*const rqsw)[RQSW_NB] = &rq->rq_status.rq_sw; + const rqsw_t (*const rqsw)[RQSW_NB] = &rq->rq_status.rq_sw; rqsw_t w; int i, last, idx; @@ -568,20 +568,27 @@ runq_first_thread(struct runq *const rq) /* * Return true if there are some processes of any priority on the run queue, - * false otherwise. Has no side effects. + * false otherwise. Has no side effects. Supports racy lookups (required by + * 4BSD). */ bool runq_not_empty(struct runq *rq) { - struct thread *const td = runq_first_thread(rq); + const rqsw_t (*const rqsw)[RQSW_NB] = &rq->rq_status.rq_sw; + int sw_idx; - if (td != NULL) { - CTR2(KTR_RUNQ, "runq_not_empty: idx=%d, td=%p", - td->td_rqindex, td); - return (true); + for (sw_idx = 0; sw_idx < RQSW_NB; ++sw_idx) { + const rqsw_t w = (*rqsw)[sw_idx]; + + if (w != 0) { + CTR3(KTR_RUNQ, "runq_not_empty: not empty; " + "rq=%p, sw_idx=%d, bits=" RQSW_PRI, + rq, sw_idx, w); + return (true); + } } - CTR0(KTR_RUNQ, "runq_not_empty: empty"); + CTR1(KTR_RUNQ, "runq_not_empty: empty; rq=%p", rq); return (false); }