On Fri, Oct 19, 2007 at 02:42:56PM -0400, Steven Rostedt wrote: > This patch adds accounting to each runqueue to keep track of the > highest prio task queued on the run queue. We only care about > RT tasks, so if the run queue does not contain any active RT tasks > its priority will be considered MAX_RT_PRIO. > > This information will be used for later patches. > [...] > @@ -972,6 +974,8 @@ static void activate_task(struct rq *rq, > > enqueue_task(rq, p, wakeup); > inc_nr_running(p, rq); > + > + rq_prio_add_task(rq, p); > } > > /* > @@ -984,6 +988,8 @@ static void deactivate_task(struct rq *r > > dequeue_task(rq, p, sleep); > dec_nr_running(p, rq); > + > + rq_prio_remove_task(rq, p); > } > > /** > @@ -6619,6 +6625,7 @@ void __init sched_init(void) > rq->cpu = i; > rq->migration_thread = NULL; > INIT_LIST_HEAD(&rq->migration_queue); > + rq->highest_prio = MAX_RT_PRIO; > #endif > atomic_set(&rq->nr_iowait, 0); > > Index: linux-test.git/kernel/sched_rt.c > =================================================================== > --- linux-test.git.orig/kernel/sched_rt.c 2007-10-19 12:33:09.000000000 -0400 > +++ linux-test.git/kernel/sched_rt.c 2007-10-19 12:33:23.000000000 -0400 > @@ -110,6 +110,31 @@ static struct task_struct *pick_next_tas > return next; > } > > +#ifdef CONFIG_SMP > +static inline void rq_prio_add_task(struct rq *rq, struct task_struct *p) > +{ > + if (unlikely(rt_task(p)) && p->prio < rq->highest_prio) > + rq->highest_prio = p->prio; > +} > + > +static inline void rq_prio_remove_task(struct rq *rq, struct task_struct *p) > +{ > + struct rt_prio_array *array; > + > + if (unlikely(rt_task(p))) { > + if (rq->rt_nr_running) { > + if (p->prio >= rq->highest_prio) { > + /* recalculate */ > + array = &rq->rt.active; > + rq->highest_prio = > + sched_find_first_bit(array->bitmap); > + } /* otherwise leave rq->highest prio alone */ > + } else > + rq->highest_prio = MAX_RT_PRIO; > + } > +} > +#endif /* CONFIG_SMP */ > + Sorry, I forgot to test this on UP. Seems to be missing a #define rq_prio_remove_task(rq, p) do { } while(0) #define rq_prio_add(rq, p) do { } while(0) for the !CONFIG_SMP case. Will fix. -- Steve - To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html