diff options
Diffstat (limited to 'kernel/sched_rt.c')
| -rw-r--r-- | kernel/sched_rt.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index 10d018212bab..97540f0c9e47 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
| @@ -185,11 +185,23 @@ static inline u64 sched_rt_period(struct rt_rq *rt_rq) | |||
| 185 | 185 | ||
| 186 | typedef struct task_group *rt_rq_iter_t; | 186 | typedef struct task_group *rt_rq_iter_t; |
| 187 | 187 | ||
| 188 | #define for_each_rt_rq(rt_rq, iter, rq) \ | 188 | static inline struct task_group *next_task_group(struct task_group *tg) |
| 189 | for (iter = list_entry_rcu(task_groups.next, typeof(*iter), list); \ | 189 | { |
| 190 | (&iter->list != &task_groups) && \ | 190 | do { |
| 191 | (rt_rq = iter->rt_rq[cpu_of(rq)]); \ | 191 | tg = list_entry_rcu(tg->list.next, |
| 192 | iter = list_entry_rcu(iter->list.next, typeof(*iter), list)) | 192 | typeof(struct task_group), list); |
| 193 | } while (&tg->list != &task_groups && task_group_is_autogroup(tg)); | ||
| 194 | |||
| 195 | if (&tg->list == &task_groups) | ||
| 196 | tg = NULL; | ||
| 197 | |||
| 198 | return tg; | ||
| 199 | } | ||
| 200 | |||
| 201 | #define for_each_rt_rq(rt_rq, iter, rq) \ | ||
| 202 | for (iter = container_of(&task_groups, typeof(*iter), list); \ | ||
| 203 | (iter = next_task_group(iter)) && \ | ||
| 204 | (rt_rq = iter->rt_rq[cpu_of(rq)]);) | ||
| 193 | 205 | ||
| 194 | static inline void list_add_leaf_rt_rq(struct rt_rq *rt_rq) | 206 | static inline void list_add_leaf_rt_rq(struct rt_rq *rt_rq) |
| 195 | { | 207 | { |
| @@ -1126,7 +1138,7 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq) | |||
| 1126 | 1138 | ||
| 1127 | rt_rq = &rq->rt; | 1139 | rt_rq = &rq->rt; |
| 1128 | 1140 | ||
| 1129 | if (unlikely(!rt_rq->rt_nr_running)) | 1141 | if (!rt_rq->rt_nr_running) |
| 1130 | return NULL; | 1142 | return NULL; |
| 1131 | 1143 | ||
| 1132 | if (rt_rq_throttled(rt_rq)) | 1144 | if (rt_rq_throttled(rt_rq)) |
| @@ -1548,7 +1560,7 @@ skip: | |||
| 1548 | static void pre_schedule_rt(struct rq *rq, struct task_struct *prev) | 1560 | static void pre_schedule_rt(struct rq *rq, struct task_struct *prev) |
| 1549 | { | 1561 | { |
| 1550 | /* Try to pull RT tasks here if we lower this rq's prio */ | 1562 | /* Try to pull RT tasks here if we lower this rq's prio */ |
| 1551 | if (unlikely(rt_task(prev)) && rq->rt.highest_prio.curr > prev->prio) | 1563 | if (rq->rt.highest_prio.curr > prev->prio) |
| 1552 | pull_rt_task(rq); | 1564 | pull_rt_task(rq); |
| 1553 | } | 1565 | } |
| 1554 | 1566 | ||
