--- sched_ule.c.orig Fri Feb 13 05:24:48 2004 +++ sched_ule.c Fri Feb 13 05:26:56 2004 @@ -186,7 +186,7 @@ #define SCHED_INTERACTIVE(kg) \ (sched_interact_score(kg) < SCHED_INTERACT_THRESH) #define SCHED_CURR(kg, ke) \ - (ke->ke_thread->td_priority != kg->kg_user_pri || \ + (ke->ke_thread->td_priority < kg->kg_user_pri || \ SCHED_INTERACTIVE(kg)) /* @@ -1167,9 +1167,13 @@ if ((ke->ke_flags & KEF_ASSIGNED) == 0) { if (TD_IS_RUNNING(td)) { if (td->td_proc->p_flag & P_SA) { + struct runq *rq; + + rq = ke->ke_runq; kseq_load_rem(KSEQ_CPU(ke->ke_cpu), ke); + ke->ke_runq = rq; setrunqueue(td); - } else + } else kseq_runq_add(KSEQ_SELF(), ke); } else { if (ke->ke_runq) { @@ -1579,10 +1583,12 @@ ke->ke_cpu = PCPU_GET(cpuid); break; case PRI_TIMESHARE: - if (SCHED_CURR(kg, ke)) - ke->ke_runq = kseq->ksq_curr; - else - ke->ke_runq = kseq->ksq_next; + if (ke->ke_runq == NULL) { + if (SCHED_CURR(kg, ke)) + ke->ke_runq = kseq->ksq_curr; + else + ke->ke_runq = kseq->ksq_next; + } break; case PRI_IDLE: /*