From nobody Thu Jan 29 23:26:50 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 4f2Ff24wryz6QG5S for ; Thu, 29 Jan 2026 23:26:50 +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" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4f2Ff24Pglz4Pt9 for ; Thu, 29 Jan 2026 23:26:50 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1769729210; 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=iWgcg67foX2/S5hk+hZVJ+PZjjfA+VRd9hyUS7eNbDM=; b=MyX2sLVVvE5m+iKkGqFixTg3Q3y3g1b3cSwFWYiziCg8PNtgjH1sqxwCoNg0NECPKGRG6A 97g2Lqj0nmoaEdWg/x4FiR4+s44tOB9VQuGY3hiPNba7ISqV0wv39pIQxCkNvH2oZP/wFb 9G1NUNUcsJDObKAYMMw+HIw+mpIzCIP8M5Y34H/lhdqGKQjvzbzGHmAIYZMDfmAdNHDXps 9Sp2Dt/YGQn/D0A7+ntOh5UM/+vsr7NAoE+KihVDKI0BKxy/rWQunOSEMPnENnstdaisEI +FotpZ2bXlxN7dpid6ZMCmyMm0wH1ENMckFfOBVns2D8avoJV7JBQUFvqM79wg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1769729210; a=rsa-sha256; cv=none; b=ToaCsHB/uJmthturhlI5rKBgFA1ulAHpmjiZrAe+o+9GjrnThsvW8DU/plnh94FHtI0I0j SByO9o/qJolnUACMb6gXaT3zVXFb7lkZ2NvWg92QhjQqsJB1LWswsGnW63HdmGJR3J337M E0Ua4FpHQOQtcXNmRyaRkJ7ALIlDeysrjkQPrHFkbZ2oTwajVCvhwcak/puFpQd7ST6u0w iBK8RB2ug2Mj46cC0/GIgIYS2NGdZlfKFVlVTyGDJI3YVFTjJ03OtW92Iwd2JtleGrEW80 pFVDYlMEUQugQ3dmUSMV72NByDGniIGG5jhx5dBGh5BhAYOhpk6AdZX/jgk6Dg== 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=1769729210; 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=iWgcg67foX2/S5hk+hZVJ+PZjjfA+VRd9hyUS7eNbDM=; b=OmfoY8hibLJgUPnAIS0KbL1Uri8EvxJE7qGwPRHStc3avQCa2WJW8XFGbzuR1vawqEUiEy EDcQxiHplbTY+UDF/NkxdqJ993oxid050GgRNKBBhtggViBMAPWZ1oRDKOZ37bS0l2pqV1 heDxPenti9UKhsZEXmsV13BwP102z77dzI0cJ2YZbUzgYJtfSPzNc3jEsfJCbLrWgudcu2 HlJfyPXBgPlnt+9N78B3wBM9qtanFtkH61WSC+QDipi7Tb1EIrNFEZWWv3Xyea4o7wLHO1 4uTvXG3ttn3LwI7ryoUkoCsoykiXTwNvWjCb07RpvvbfOokawa3Qk7Q9rVnzcA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4f2Ff23kcBzymv for ; Thu, 29 Jan 2026 23:26:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 8609 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 29 Jan 2026 23:26:50 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: b249cb2b18b3 - main - SCHED_4BSD: maybe_resched() cannot schedule ast() for curthread 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: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: b249cb2b18b3fddae186d45fe6d984fc7bde10c4 Auto-Submitted: auto-generated Date: Thu, 29 Jan 2026 23:26:50 +0000 Message-Id: <697becba.8609.1cdfafc@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=b249cb2b18b3fddae186d45fe6d984fc7bde10c4 commit b249cb2b18b3fddae186d45fe6d984fc7bde10c4 Author: Konstantin Belousov AuthorDate: 2026-01-29 08:09:00 +0000 Commit: Konstantin Belousov CommitDate: 2026-01-29 23:26:16 +0000 SCHED_4BSD: maybe_resched() cannot schedule ast() for curthread maybe_resched() needs to schedule TDA_SCHED for curthread, but this requires taking curthread lock while owning some other thread lock. To avoid introducing the order: - Use a scheduler-private TDP flag. - Register an unconditional TDA_SCHED_PRIV for 4BSD. When an AST needs to be scheduled, i.e. the current thread must do context switch in the return to userspace path, set the flag. Then the ast handler calls ast_scheduler(), which gives the same effect as scheduling TDA_AST. The overhead is a single function call on each userspace return, for 4BSD case. Reported and tested by: pho (previous version) Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D54945 --- sys/kern/kern_synch.c | 2 +- sys/kern/sched_4bsd.c | 21 +++++++++++++++++++-- sys/sys/proc.h | 1 + sys/sys/sched.h | 2 ++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c index 8e956324ee23..fc6c9857463c 100644 --- a/sys/kern/kern_synch.c +++ b/sys/kern/kern_synch.c @@ -600,7 +600,7 @@ loadav(void *arg) loadav, NULL, C_DIRECT_EXEC | C_PREL(32)); } -static void +void ast_scheduler(struct thread *td, int tda __unused) { #ifdef KTRACE diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c index 317b47da2cca..a47fe3ce72c3 100644 --- a/sys/kern/sched_4bsd.c +++ b/sys/kern/sched_4bsd.c @@ -108,6 +108,8 @@ struct td_sched { #define TDF_BOUND TDF_SCHED1 /* Bound to one CPU. */ #define TDF_SLICEEND TDF_SCHED2 /* Thread time slice is over. */ +#define TDP_RESCHED TDP_SCHED1 /* Reschedule due to maybe_resched(). */ + /* flags kept in ts_flags */ #define TSF_AFFINITY 0x0001 /* Has a non-"full" CPU set. */ @@ -274,6 +276,17 @@ sched_load_rem(void) KTR_COUNTER0(KTR_SCHED, "load", "global load", sched_tdcnt); SDT_PROBE2(sched, , , load__change, NOCPU, sched_tdcnt); } + +static void +maybe_resched_ast(struct thread *td, int tda) +{ + MPASS(td == curthread); /* We are AST */ + if ((td->td_pflags & TDP_RESCHED) != 0) { + td->td_pflags &= ~TDP_RESCHED; + ast_scheduler(td, tda); + } +} + /* * Arrange to reschedule if necessary, taking the priorities and * schedulers into account. @@ -281,10 +294,12 @@ sched_load_rem(void) static void maybe_resched(struct thread *td) { + struct thread *ctd; + ctd = curthread; THREAD_LOCK_ASSERT(td, MA_OWNED); - if (td->td_priority < curthread->td_priority) - ast_sched_locked(curthread, TDA_SCHED); + if (td->td_priority < ctd->td_priority) + ctd->td_pflags |= TDP_RESCHED; } /* @@ -621,6 +636,8 @@ sched_4bsd_setup(void) /* Account for thread0. */ sched_load_add(); + + ast_register(TDA_SCHED_PRIV, ASTR_UNCOND, 0, maybe_resched_ast); } /* diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 0c9658fff725..7c4431ab0819 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -503,6 +503,7 @@ enum { TDA_SIGSUSPEND, TDA_MOD3, /* .. and after */ TDA_MOD4, + TDA_SCHED_PRIV, TDA_MAX, }; #define TDAI(tda) (1U << (tda)) diff --git a/sys/sys/sched.h b/sys/sys/sched.h index 08d8636aaa68..c7b7b849947c 100644 --- a/sys/sys/sched.h +++ b/sys/sys/sched.h @@ -188,6 +188,8 @@ sched_unpin(void) curthread->td_pinned--; } +void ast_scheduler(struct thread *td, int tda); + /* sched_add arguments (formerly setrunqueue) */ #define SRQ_BORING 0x0000 /* No special circumstances. */ #define SRQ_YIELDING 0x0001 /* We are yielding (from mi_switch). */