From: Con Kolivas Small error in the just interactive logic has been corrected. Idle tasks get one higher priority than just interactive so they don't get swamped under heavy load. Cosmetic cleanup. kernel/sched.c | 31 +++++++++++++++---------------- 1 files changed, 15 insertions(+), 16 deletions(-) diff -puN kernel/sched.c~o19int kernel/sched.c --- 25/kernel/sched.c~o19int 2003-08-30 16:01:59.000000000 -0700 +++ 25-akpm/kernel/sched.c 2003-08-30 16:01:59.000000000 -0700 @@ -64,8 +64,8 @@ /* * Some helpers for converting nanosecond timing to jiffy resolution */ -#define NS_TO_JIFFIES(TIME) (TIME / (1000000000 / HZ)) -#define JIFFIES_TO_NS(TIME) (TIME * (1000000000 / HZ)) +#define NS_TO_JIFFIES(TIME) ((TIME) / (1000000000 / HZ)) +#define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ)) /* * These are the 'tuning knobs' of the scheduler: @@ -132,7 +132,8 @@ ((p)->prio <= (p)->static_prio - DELTA(p)) #define JUST_INTERACTIVE_SLEEP(p) \ - (MAX_SLEEP_AVG - (DELTA(p) * AVG_TIMESLICE)) + (JIFFIES_TO_NS(MAX_SLEEP_AVG * \ + (MAX_BONUS / 2 + DELTA((p)) + 1) / MAX_BONUS - 1)) #define HIGH_CREDIT(p) \ ((p)->interactive_credit > MAX_SLEEP_AVG) @@ -382,10 +383,8 @@ static void recalc_task_prio(task_t *p, * prevent them suddenly becoming cpu hogs and starving * other processes. */ - if (p->mm && sleep_time > - JIFFIES_TO_NS(JUST_INTERACTIVE_SLEEP(p))) - p->sleep_avg = - JIFFIES_TO_NS(JUST_INTERACTIVE_SLEEP(p)); + if (p->mm && sleep_time >JUST_INTERACTIVE_SLEEP(p)) + p->sleep_avg = JUST_INTERACTIVE_SLEEP(p) + 1; else { /* * The lower the sleep avg a task has the more @@ -405,16 +404,15 @@ static void recalc_task_prio(task_t *p, /* * Non high_credit tasks waking from uninterruptible * sleep are limited in their sleep_avg rise as they - * are likely to be waiting on I/O + * are likely to be cpu hogs waiting on I/O */ if (p->activated == -1 && !HIGH_CREDIT(p) && p->mm){ - if (p->sleep_avg >= - JIFFIES_TO_NS(JUST_INTERACTIVE_SLEEP(p))) - sleep_time = 0; + if (p->sleep_avg >= JUST_INTERACTIVE_SLEEP(p)) + sleep_time = 0; else if (p->sleep_avg + sleep_time >= - JIFFIES_TO_NS(JUST_INTERACTIVE_SLEEP(p))){ + JUST_INTERACTIVE_SLEEP(p)){ p->sleep_avg = - JIFFIES_TO_NS(JUST_INTERACTIVE_SLEEP(p)); + JUST_INTERACTIVE_SLEEP(p); sleep_time = 0; } } @@ -431,7 +429,8 @@ static void recalc_task_prio(task_t *p, if (p->sleep_avg > NS_MAX_SLEEP_AVG){ p->sleep_avg = NS_MAX_SLEEP_AVG; - p->interactive_credit += !(HIGH_CREDIT(p)); + if (!HIGH_CREDIT(p)) + p->interactive_credit++; } } } @@ -1548,8 +1547,8 @@ switch_tasks: prev->sleep_avg -= run_time; if ((long)prev->sleep_avg <= 0){ prev->sleep_avg = 0; - prev->interactive_credit -= - !(HIGH_CREDIT(prev) || LOW_CREDIT(prev)); + if (!(HIGH_CREDIT(prev) || LOW_CREDIT(prev))) + prev->interactive_credit--; } prev->timestamp = now; _