diff options
Diffstat (limited to 'kernel/sched_rt.c')
-rw-r--r-- | kernel/sched_rt.c | 18 |
1 files changed, 18 insertions, 0 deletions
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) |