|
@@ -1985,6 +1985,8 @@ static void watchdog(struct rq *rq, struct task_struct *p)
|
|
|
|
|
|
static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)
|
|
|
{
|
|
|
+ struct sched_rt_entity *rt_se = &p->rt;
|
|
|
+
|
|
|
update_curr_rt(rq);
|
|
|
|
|
|
watchdog(rq, p);
|
|
@@ -2002,12 +2004,15 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)
|
|
|
p->rt.time_slice = RR_TIMESLICE;
|
|
|
|
|
|
/*
|
|
|
- * Requeue to the end of queue if we are not the only element
|
|
|
- * on the queue:
|
|
|
+ * Requeue to the end of queue if we (and all of our ancestors) are the
|
|
|
+ * only element on the queue
|
|
|
*/
|
|
|
- if (p->rt.run_list.prev != p->rt.run_list.next) {
|
|
|
- requeue_task_rt(rq, p, 0);
|
|
|
- set_tsk_need_resched(p);
|
|
|
+ for_each_sched_rt_entity(rt_se) {
|
|
|
+ if (rt_se->run_list.prev != rt_se->run_list.next) {
|
|
|
+ requeue_task_rt(rq, p, 0);
|
|
|
+ set_tsk_need_resched(p);
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|