Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 26919
b: refs/heads/master
c: f1adad7
h: refs/heads/master
i:
  26917: 9ce9639
  26915: 10b1ffc
  26911: 1fd6ba8
v: v3
  • Loading branch information
Linus Torvalds committed May 22, 2006
1 parent 52048fc commit 707df55
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 45 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c9d20af62c59e49684f3882503351153964ff14b
refs/heads/master: f1adad78dd2fc8edaa513e0bde92b4c64340245c
62 changes: 18 additions & 44 deletions trunk/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 707df55

Please sign in to comment.