int rt_load_balance_idx;
        struct list_head *rt_load_balance_head, *rt_load_balance_curr;
        unsigned long rt_nr_running;
+       /* highest queued rt task prio */
+       int highest_prio;
 };
 
 /*
                rq->cpu = i;
                rq->migration_thread = NULL;
                INIT_LIST_HEAD(&rq->migration_queue);
+               rq->rt.highest_prio = MAX_RT_PRIO;
 #endif
                atomic_set(&rq->nr_iowait, 0);
 
 
 {
        WARN_ON(!rt_task(p));
        rq->rt.rt_nr_running++;
+#ifdef CONFIG_SMP
+       if (p->prio < rq->rt.highest_prio)
+               rq->rt.highest_prio = p->prio;
+#endif /* CONFIG_SMP */
 }
 
 static inline void dec_rt_tasks(struct task_struct *p, struct rq *rq)
        WARN_ON(!rt_task(p));
        WARN_ON(!rq->rt.rt_nr_running);
        rq->rt.rt_nr_running--;
+#ifdef CONFIG_SMP
+       if (rq->rt.rt_nr_running) {
+               struct rt_prio_array *array;
+
+               WARN_ON(p->prio < rq->rt.highest_prio);
+               if (p->prio == rq->rt.highest_prio) {
+                       /* recalculate */
+                       array = &rq->rt.active;
+                       rq->rt.highest_prio =
+                               sched_find_first_bit(array->bitmap);
+               } /* otherwise leave rq->highest prio alone */
+       } else
+               rq->rt.highest_prio = MAX_RT_PRIO;
+#endif /* CONFIG_SMP */
 }
 
 static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int wakeup)