Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[pandora-kernel.git] / kernel / sched_rt.c
index 8bfdb3f..274b40d 100644 (file)
@@ -94,8 +94,11 @@ static void sched_rt_ratio_enqueue(struct rt_rq *rt_rq)
        struct sched_rt_entity *rt_se = rt_rq->rt_se;
 
        if (rt_se && !on_rt_rq(rt_se) && rt_rq->rt_nr_running) {
+               struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr;
+
                enqueue_rt_entity(rt_se);
-               resched_task(rq_of_rt_rq(rt_rq)->curr);
+               if (rt_rq->highest_prio < curr->prio)
+                       resched_task(curr);
        }
 }
 
@@ -473,15 +476,12 @@ static struct sched_rt_entity *pick_next_rt_entity(struct rq *rq,
        struct list_head *queue;
        int idx;
 
-       if (sched_rt_ratio_exceeded(rt_rq))
-               goto out;
-
        idx = sched_find_first_bit(array->bitmap);
        BUG_ON(idx >= MAX_RT_PRIO);
 
        queue = array->queue + idx;
        next = list_entry(queue->next, struct sched_rt_entity, run_list);
- out:
+
        return next;
 }
 
@@ -491,7 +491,6 @@ static struct task_struct *pick_next_task_rt(struct rq *rq)
        struct task_struct *p;
        struct rt_rq *rt_rq;
 
- retry:
        rt_rq = &rq->rt;
 
        if (unlikely(!rt_rq->rt_nr_running))
@@ -502,8 +501,7 @@ static struct task_struct *pick_next_task_rt(struct rq *rq)
 
        do {
                rt_se = pick_next_rt_entity(rq, rt_rq);
-               if (unlikely(!rt_se))
-                       goto retry;
+               BUG_ON(!rt_se);
                rt_rq = group_rt_rq(rt_se);
        } while (rt_rq);
 
@@ -1122,13 +1120,7 @@ static void watchdog(struct rq *rq, struct task_struct *p)
 
                p->rt.timeout++;
                next = DIV_ROUND_UP(min(soft, hard), USEC_PER_SEC/HZ);
-               if (next > p->rt.timeout) {
-                       u64 next_time = p->se.sum_exec_runtime;
-
-                       next_time += next * (NSEC_PER_SEC/HZ);
-                       if (p->it_sched_expires > next_time)
-                               p->it_sched_expires = next_time;
-               } else
+               if (p->rt.timeout > next)
                        p->it_sched_expires = p->se.sum_exec_runtime;
        }
 }