From: Nick Piggin This should get SCHED_FIFO yielding working properly again. It actually simplifies things a bit, which is good. Signed-off-by: Andrew Morton --- 25-akpm/kernel/sched.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff -puN kernel/sched.c~nicksched-sched_fifo-fix kernel/sched.c --- 25/kernel/sched.c~nicksched-sched_fifo-fix Thu Sep 9 15:40:07 2004 +++ 25-akpm/kernel/sched.c Thu Sep 9 15:40:07 2004 @@ -2358,10 +2358,9 @@ need_resched: if (unlikely(prev->used_slice == -1)) { if (rt_task(prev)) { - if (prev->policy == SCHED_RR) { - dequeue_task(prev, prev->array); - enqueue_task(prev, rq->active); - } + /* SCHED_FIFO can come in here too, from sched_yield */ + dequeue_task(prev, prev->array); + enqueue_task(prev, rq->active); } else { dequeue_task(prev, prev->array); prev->prio = task_priority(prev); @@ -2922,6 +2921,9 @@ static int setscheduler(pid_t pid, int p retval = 0; oldprio = p->prio; __setscheduler(p, policy, lp.sched_priority); + if (policy == SCHED_FIFO || policy == SCHED_RR) + p->used_slice = 0; + if (array) { __activate_task(p, rq, array); /* _