Skip to content

Commit

Permalink
Revert "[PATCH] sched: fix interactive task starvation"
Browse files Browse the repository at this point in the history
This reverts commit 5ce74ab (and its
dependent commit 8a5bc07), because of
audio underruns.

Reported by Rene Herman <rene.herman@keyaccess.nl>, who also pinpointed
the exact cause of the underruns:

  "Audio underruns galore, with only ogg123 and firefox (browsing the
   GIT tree online is also a nice trigger by the way).

   If I back it out, everything is fine for me again."

Cc: Rene Herman <rene.herman@keyaccess.nl>
Cc: Mike Galbraith <efault@gmx.de>
Acked-by: Con Kolivas <kernel@kolivas.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Linus Torvalds committed May 22, 2006
1 parent c9d20af commit f1adad7
Showing 1 changed file with 18 additions and 44 deletions.
62 changes: 18 additions & 44 deletions kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -664,56 +664,14 @@ static int effective_prio(task_t *p)
return prio;
}

/*
* We place interactive tasks back into the active array, if possible.
*
* To guarantee that this does not starve expired tasks we ignore the
* interactivity of a task if the first expired task had to wait more
* than a 'reasonable' amount of time. This deadline timeout is
* load-dependent, as the frequency of array switched decreases with
* increasing number of running tasks. We also ignore the interactivity
* if a better static_prio task has expired, and switch periodically
* regardless, to ensure that highly interactive tasks do not starve
* the less fortunate for unreasonably long periods.
*/
static inline int expired_starving(runqueue_t *rq)
{
int limit;

/*
* Arrays were recently switched, all is well
*/
if (!rq->expired_timestamp)
return 0;

limit = STARVATION_LIMIT * rq->nr_running;

/*
* It's time to switch arrays
*/
if (jiffies - rq->expired_timestamp >= limit)
return 1;

/*
* There's a better selection in the expired array
*/
if (rq->curr->static_prio > rq->best_expired_prio)
return 1;

/*
* All is well
*/
return 0;
}

/*
* __activate_task - move a task to the runqueue.
*/
static void __activate_task(task_t *p, runqueue_t *rq)
{
prio_array_t *target = rq->active;

if (unlikely(batch_task(p) || (expired_starving(rq) && !rt_task(p))))
if (batch_task(p))
target = rq->expired;
enqueue_task(p, target);
rq->nr_running++;
Expand Down Expand Up @@ -2531,6 +2489,22 @@ unsigned long long current_sched_time(const task_t *tsk)
return ns;
}

/*
* We place interactive tasks back into the active array, if possible.
*
* To guarantee that this does not starve expired tasks we ignore the
* interactivity of a task if the first expired task had to wait more
* than a 'reasonable' amount of time. This deadline timeout is
* load-dependent, as the frequency of array switched decreases with
* increasing number of running tasks. We also ignore the interactivity
* if a better static_prio task has expired:
*/
#define EXPIRED_STARVING(rq) \
((STARVATION_LIMIT && ((rq)->expired_timestamp && \
(jiffies - (rq)->expired_timestamp >= \
STARVATION_LIMIT * ((rq)->nr_running) + 1))) || \
((rq)->curr->static_prio > (rq)->best_expired_prio))

/*
* Account user cpu time to a process.
* @p: the process that the cpu time gets accounted to
Expand Down Expand Up @@ -2666,7 +2640,7 @@ void scheduler_tick(void)

if (!rq->expired_timestamp)
rq->expired_timestamp = jiffies;
if (!TASK_INTERACTIVE(p) || expired_starving(rq)) {
if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) {
enqueue_task(p, rq->expired);
if (p->static_prio < rq->best_expired_prio)
rq->best_expired_prio = p->static_prio;
Expand Down

0 comments on commit f1adad7

Please sign in to comment.