diff options
-rw-r--r-- | kernel/sched.c | 3 | ||||
-rw-r--r-- | kernel/sched_rt.c | 18 |
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 | ||
35 | static inline void dec_rt_tasks(struct task_struct *p, struct rq *rq) | 39 | static 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 | ||
42 | static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int wakeup) | 60 | static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int wakeup) |