From: Nick Piggin <nickpiggin@yahoo.com.au>

This should get SCHED_FIFO yielding working properly again.  It actually
simplifies things a bit, which is good.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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);
 		/*
_