Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Feb 2026 05:17:38 +0000
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 68feaa1cf268 - stable/15 - SCHED_4BSD: maybe_resched() cannot schedule ast() for curthread
Message-ID:  <698c10f2.2670f.34166c50@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/15 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=68feaa1cf2684c520829fb245bd4b9381e655c18

commit 68feaa1cf2684c520829fb245bd4b9381e655c18
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-01-29 08:09:00 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-02-11 05:12:38 +0000

    SCHED_4BSD: maybe_resched() cannot schedule ast() for curthread
    
    (cherry picked from commit b249cb2b18b3fddae186d45fe6d984fc7bde10c4)
---
 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 0ab0ccb3d05b..22628c78d8a5 100644
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -596,7 +596,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). */


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?698c10f2.2670f.34166c50>