Index: linux-2.6.12-mm1/kernel/sched.c =================================================================== --- linux-2.6.12-mm1.orig/kernel/sched.c 2005-06-26 13:12:24.000000000 +1000 +++ linux-2.6.12-mm1/kernel/sched.c 2005-06-26 14:53:11.000000000 +1000 @@ -669,6 +669,35 @@ static inline void dec_prio_bias(runqueu { rq->prio_bias -= MAX_PRIO - prio; } + +static inline void inc_nr_running(task_t *p, runqueue_t *rq) +{ + rq->nr_running++; + if (rt_task(p)) { + /* + * The migration thread does the actual balancing so its + * effect on the priority bias should be minimal as it would + * would otherwise be seen as ultra high priority. + */ + if (p == rq->migration_thread) + inc_prio_bias(rq, MAX_PRIO - 1); + else + inc_prio_bias(rq, p->prio); + } else + inc_prio_bias(rq, p->static_prio); +} + +static inline void dec_nr_running(task_t *p, runqueue_t *rq) +{ + rq->nr_running--; + if (rt_task(p)) { + if (p == rq->migration_thread) + dec_prio_bias(rq, MAX_PRIO - 1); + else + dec_prio_bias(rq, p->prio); + } else + dec_prio_bias(rq, p->static_prio); +} #else static inline void inc_prio_bias(runqueue_t *rq, int prio) { @@ -677,25 +706,17 @@ static inline void inc_prio_bias(runqueu static inline void dec_prio_bias(runqueue_t *rq, int prio) { } -#endif static inline void inc_nr_running(task_t *p, runqueue_t *rq) { rq->nr_running++; - if (rt_task(p)) - inc_prio_bias(rq, p->prio); - else - inc_prio_bias(rq, p->static_prio); } static inline void dec_nr_running(task_t *p, runqueue_t *rq) { rq->nr_running--; - if (rt_task(p)) - dec_prio_bias(rq, p->prio); - else - dec_prio_bias(rq, p->static_prio); } +#endif /* * __activate_task - move a task to the runqueue.