- In sched_add() special case PRI_TIMESHARE and PRI_ITHD|PRI_REALTIME. We

always place ITHD & REALTIME threads on the current queue of the current
   cpu.  Prior to this change an interrupt thread would only ever run on one
   cpu.
This commit is contained in:
jeff 2003-03-03 04:28:07 +00:00
parent f0f35853d0
commit 2d1c8006af

View File

@ -176,8 +176,7 @@ sched_slp_ratio(int b, int s)
* XXX nice value should effect how interactive a kg is. * XXX nice value should effect how interactive a kg is.
*/ */
#define SCHED_CURR(kg) (((kg)->kg_slptime > (kg)->kg_runtime && \ #define SCHED_CURR(kg) (((kg)->kg_slptime > (kg)->kg_runtime && \
sched_slp_ratio((kg)->kg_slptime, (kg)->kg_runtime) > 4) || \ sched_slp_ratio((kg)->kg_slptime, (kg)->kg_runtime) > 4))
(kg)->kg_pri_class != PRI_TIMESHARE)
/* /*
* Cpu percentage computation macros and defines. * Cpu percentage computation macros and defines.
@ -808,13 +807,27 @@ sched_add(struct kse *ke)
KASSERT(ke->ke_proc->p_sflag & PS_INMEM, KASSERT(ke->ke_proc->p_sflag & PS_INMEM,
("sched_add: process swapped out")); ("sched_add: process swapped out"));
kseq = KSEQ_CPU(ke->ke_cpu); /*
* Timeshare threads get placed on the appropriate queue on their
* bound cpu.
*/
if (ke->ke_ksegrp->kg_pri_class == PRI_TIMESHARE) {
kseq = KSEQ_CPU(ke->ke_cpu);
if (ke->ke_runq == NULL) { if (ke->ke_runq == NULL) {
if (SCHED_CURR(ke->ke_ksegrp)) if (SCHED_CURR(ke->ke_ksegrp))
ke->ke_runq = kseq->ksq_curr; ke->ke_runq = kseq->ksq_curr;
else else
ke->ke_runq = kseq->ksq_next; ke->ke_runq = kseq->ksq_next;
}
/*
* If we're a real-time or interrupt thread place us on the curr
* queue for the current processor. Hopefully this will yield the
* lowest latency response.
*/
} else {
kseq = KSEQ_SELF();
ke->ke_runq = kseq->ksq_curr;
} }
ke->ke_ksegrp->kg_runq_kses++; ke->ke_ksegrp->kg_runq_kses++;
ke->ke_state = KES_ONRUNQ; ke->ke_state = KES_ONRUNQ;