Revert "[PATCH] sched: fix interactive task starvation"
This reverts commit5ce74abe78
(and its dependent commit8a5bc075b8
), 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>
This commit is contained in:
Родитель
c9d20af62c
Коммит
f1adad78dd
|
@ -664,48 +664,6 @@ 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.
|
||||
*/
|
||||
|
@ -713,7 +671,7 @@ 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++;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче