Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f1adad78 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Revert "[PATCH] sched: fix interactive task starvation"



This reverts commit 5ce74abe (and its
dependent commit 8a5bc075), 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: default avatarCon Kolivas <kernel@kolivas.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c9d20af6
Loading
Loading
Loading
Loading
+18 −44
Original line number Diff line number Diff line
@@ -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;