aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/sched.c3
-rw-r--r--kernel/sched_rt.c18
2 files changed, 21 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 9dd8d121eea6..6185fa080ec8 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -343,6 +343,8 @@ struct rt_rq {
343 int rt_load_balance_idx; 343 int rt_load_balance_idx;
344 struct list_head *rt_load_balance_head, *rt_load_balance_curr; 344 struct list_head *rt_load_balance_head, *rt_load_balance_curr;
345 unsigned long rt_nr_running; 345 unsigned long rt_nr_running;
346 /* highest queued rt task prio */
347 int highest_prio;
346}; 348};
347 349
348/* 350/*
@@ -6864,6 +6866,7 @@ void __init sched_init(void)
6864 rq->cpu = i; 6866 rq->cpu = i;
6865 rq->migration_thread = NULL; 6867 rq->migration_thread = NULL;
6866 INIT_LIST_HEAD(&rq->migration_queue); 6868 INIT_LIST_HEAD(&rq->migration_queue);
6869 rq->rt.highest_prio = MAX_RT_PRIO;
6867#endif 6870#endif
6868 atomic_set(&rq->nr_iowait, 0); 6871 atomic_set(&rq->nr_iowait, 0);
6869 6872
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index e3d2ca8832af..136c2857a049 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -30,6 +30,10 @@ static inline void inc_rt_tasks(struct task_struct *p, struct rq *rq)
30{ 30{
31 WARN_ON(!rt_task(p)); 31 WARN_ON(!rt_task(p));
32 rq->rt.rt_nr_running++; 32 rq->rt.rt_nr_running++;
33#ifdef CONFIG_SMP
34 if (p->prio < rq->rt.highest_prio)
35 rq->rt.highest_prio = p->prio;
36#endif /* CONFIG_SMP */
33} 37}
34 38
35static inline void dec_rt_tasks(struct task_struct *p, struct rq *rq) 39static inline void dec_rt_tasks(struct task_struct *p, struct rq *rq)
@@ -37,6 +41,20 @@ static inline void dec_rt_tasks(struct task_struct *p, struct rq *rq)
37 WARN_ON(!rt_task(p)); 41 WARN_ON(!rt_task(p));
38 WARN_ON(!rq->rt.rt_nr_running); 42 WARN_ON(!rq->rt.rt_nr_running);
39 rq->rt.rt_nr_running--; 43 rq->rt.rt_nr_running--;
44#ifdef CONFIG_SMP
45 if (rq->rt.rt_nr_running) {
46 struct rt_prio_array *array;
47
48 WARN_ON(p->prio < rq->rt.highest_prio);
49 if (p->prio == rq->rt.highest_prio) {
50 /* recalculate */
51 array = &rq->rt.active;
52 rq->rt.highest_prio =
53 sched_find_first_bit(array->bitmap);
54 } /* otherwise leave rq->highest prio alone */
55 } else
56 rq->rt.highest_prio = MAX_RT_PRIO;
57#endif /* CONFIG_SMP */
40} 58}
41 59
42static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int wakeup) 60static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int wakeup)