Hide Forgot
Appearance: tasks with SCHED_RR policy are not preempted by other SCHED_RR tasks of the same static priority over the time quantum. SCHED_RR works exactly like SCHED_FIFO. Possible explanation: looking at the schedule() function, it becomes clear that although an exhausted SCHED_RR task is moved to be last in the runqueue, it is chosen to run anyway. Indeed, if prev->state was TASK_RUNNING (as it is when a task is about to be preempted because its time quantum has expired), the code at "still_running" will set the initial search pointer ("next") to the exhausted task itself: if (prev->state == TASK_RUNNING) goto still_running; .......... still_running: c = prev_goodness(prev, prev, this_cpu); next = prev; goto still_running_back; Thus, the search will start from the exhausted task itself and it will be chosen to run next, resulting in no preemption. Possible fix: the above "if" statement, if changed to the following: if (prev->policy != SCHED_RR && prev->state == TASK_RUNNING) goto still_running; fixes the problem. Please, correct me if I'm wrong, but I think that's the way SCHED_RR should work.