Page MenuHomeFreeBSD

D54945.id170755.diff
No OneTemporary

D54945.id170755.diff

diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -600,7 +600,7 @@
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
--- a/sys/kern/sched_4bsd.c
+++ b/sys/kern/sched_4bsd.c
@@ -108,6 +108,8 @@
#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 @@
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 @@
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 @@
/* 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
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -503,6 +503,7 @@
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
--- a/sys/sys/sched.h
+++ b/sys/sys/sched.h
@@ -188,6 +188,8 @@
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). */

File Metadata

Mime Type
text/plain
Expires
Wed, Sep 2, 2:04 PM (18 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37954155
Default Alt Text
D54945.id170755.diff (2 KB)

Event Timeline