Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 30791
b: refs/heads/master
c: 72d2854
h: refs/heads/master
i:
  30789: 3897b9e
  30787: e0e37bb
  30783: 3e3c924
v: v3
  • Loading branch information
Con Kolivas authored and Linus Torvalds committed Jun 28, 2006
1 parent 69fd28b commit 8d425b7
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 26 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: d444886e149a8413159da8b43ada2bc287e69b0c
refs/heads/master: 72d2854d4ebf5faf086ebccb2ed575c6b68a05dc
52 changes: 27 additions & 25 deletions trunk/kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -686,46 +686,48 @@ static inline void __activate_idle_task(task_t *p, runqueue_t *rq)
static int recalc_task_prio(task_t *p, unsigned long long now)
{
/* Caller must always ensure 'now >= p->timestamp' */
unsigned long long __sleep_time = now - p->timestamp;
unsigned long sleep_time;
unsigned long sleep_time = now - p->timestamp;

if (batch_task(p))
sleep_time = 0;
else {
if (__sleep_time > NS_MAX_SLEEP_AVG)
sleep_time = NS_MAX_SLEEP_AVG;
else
sleep_time = (unsigned long)__sleep_time;
}

if (likely(sleep_time > 0)) {
/*
* User tasks that sleep a long time are categorised as
* idle. They will only have their sleep_avg increased to a
* level that makes them just interactive priority to stay
* active yet prevent them suddenly becoming cpu hogs and
* starving other processes.
* This ceiling is set to the lowest priority that would allow
* a task to be reinserted into the active array on timeslice
* completion.
*/
if (p->mm && sleep_time > INTERACTIVE_SLEEP(p)) {
unsigned long ceiling;
unsigned long ceiling = INTERACTIVE_SLEEP(p);

ceiling = JIFFIES_TO_NS(MAX_SLEEP_AVG -
DEF_TIMESLICE);
if (p->sleep_avg < ceiling)
p->sleep_avg = ceiling;
if (p->mm && sleep_time > ceiling && p->sleep_avg < ceiling) {
/*
* Prevents user tasks from achieving best priority
* with one single large enough sleep.
*/
p->sleep_avg = ceiling;
/*
* Using INTERACTIVE_SLEEP() as a ceiling places a
* nice(0) task 1ms sleep away from promotion, and
* gives it 700ms to round-robin with no chance of
* being demoted. This is more than generous, so
* mark this sleep as non-interactive to prevent the
* on-runqueue bonus logic from intervening should
* this task not receive cpu immediately.
*/
p->sleep_type = SLEEP_NONINTERACTIVE;
} else {
/*
* Tasks waking from uninterruptible sleep are
* limited in their sleep_avg rise as they
* are likely to be waiting on I/O
*/
if (p->sleep_type == SLEEP_NONINTERACTIVE && p->mm) {
if (p->sleep_avg >= INTERACTIVE_SLEEP(p))
if (p->sleep_avg >= ceiling)
sleep_time = 0;
else if (p->sleep_avg + sleep_time >=
INTERACTIVE_SLEEP(p)) {
p->sleep_avg = INTERACTIVE_SLEEP(p);
sleep_time = 0;
ceiling) {
p->sleep_avg = ceiling;
sleep_time = 0;
}
}

Expand All @@ -739,9 +741,9 @@ static int recalc_task_prio(task_t *p, unsigned long long now)
*/
p->sleep_avg += sleep_time;

if (p->sleep_avg > NS_MAX_SLEEP_AVG)
p->sleep_avg = NS_MAX_SLEEP_AVG;
}
if (p->sleep_avg > NS_MAX_SLEEP_AVG)
p->sleep_avg = NS_MAX_SLEEP_AVG;
}

return effective_prio(p);
Expand Down

0 comments on commit 8d425b7

Please sign in to comment.