@@ -2314,10 +2314,17 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)
/*
* RR tasks need a special form of timeslice management.
- * FIFO tasks have no timeslices.
+ * FIFO tasks have no timeslices. But if p(current) is a
+ * FIFO task, try to push it away.
*/
- if (p->policy != SCHED_RR)
+ if (p->policy != SCHED_RR) {
+ if (p->nr_cpus_allowed > 1 &&
+ rq->rt.rt_nr_running > 1 &&
+ !test_tsk_need_resched(p))
+ check_preempt_equal_prio_common(rq);
+
return;
+ }
if (--p->rt.time_slice)
return;