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 2004-08-30 22:20:00.758060640 -0700 +++ 25-akpm/kernel/sched.c 2004-08-30 22:20:00.764059728 -0700 @@ -2510,10 +2510,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); @@ -3074,6 +3073,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); /* _