summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2004-09-06 07:23:14 +0000
committerjulian <julian@FreeBSD.org>2004-09-06 07:23:14 +0000
commit91180c0a8cec56a5b3f52158ed240314737edc1b (patch)
tree7a6dfdbbecf4fcd50504e13291480d0e22e426fe
parent90a7523335361d296e31fcafd85b8d9085619f1a (diff)
downloadFreeBSD-src-91180c0a8cec56a5b3f52158ed240314737edc1b.zip
FreeBSD-src-91180c0a8cec56a5b3f52158ed240314737edc1b.tar.gz
Don't do IPIs on behalf of interrupt threads.
just punt straight on through to teh preemption code. Make a KASSSERT out of a condition that can no longer occur. MFC after: 1 week
-rw-r--r--sys/kern/kern_switch.c4
-rw-r--r--sys/kern/sched_4bsd.c5
2 files changed, 5 insertions, 4 deletions
diff --git a/sys/kern/kern_switch.c b/sys/kern/kern_switch.c
index eeed120..399e3e9 100644
--- a/sys/kern/kern_switch.c
+++ b/sys/kern/kern_switch.c
@@ -502,8 +502,8 @@ maybe_preempt(struct thread *td)
* to the new thread.
*/
ctd = curthread;
- if (ctd->td_kse == NULL || ctd->td_kse->ke_thread != ctd)
- return (0);
+ KASSERT ((ctd->td_kse != NULL && ctd->td_kse->ke_thread == ctd),
+ ("thread has no (or wrong) sched-private part."));
pri = td->td_priority;
cpri = ctd->td_priority;
if (pri >= cpri || cold /* || dumping */ || TD_IS_INHIBITED(ctd) ||
diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c
index 62cde32..60b13ce 100644
--- a/sys/kern/sched_4bsd.c
+++ b/sys/kern/sched_4bsd.c
@@ -949,9 +949,10 @@ sched_add(struct thread *td, int flags)
* the thread is unpinned
* or pinned to another cpu,
* and there are other available and idle CPUs.
- * if we are idle, then skip straight to preemption.
+ * if we are idle, or it's an interrupt,
+ * then skip straight to preemption.
*/
- if ( (! idle) &&
+ if ( (! idle) && ((flags & SRQ_INTR) == 0) &&
(idle_cpus_mask & ~(hlt_cpus_mask | me)) &&
( KSE_CAN_MIGRATE(ke) ||
ke->ke_runq != &runq_pcpu[PCPU_GET(cpuid)])) {
OpenPOWER on IntegriCloud