From: Con Kolivas The bug in the O6int patch probably wasn't responsible for Wiktor's problem actually. It shouldn't manifest for a very long time. Anyway here is the fix and a couple of minor cleanups. kernel/sched.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff -puN kernel/sched.c~o6.1int kernel/sched.c --- 25/kernel/sched.c~o6.1int 2003-07-16 20:03:58.000000000 -0700 +++ 25-akpm/kernel/sched.c 2003-07-16 20:03:58.000000000 -0700 @@ -78,7 +78,7 @@ #define STARVATION_LIMIT (10*HZ) #define SLEEP_BUFFER (HZ/100) #define NODE_THRESHOLD 125 -#define MAX_BONUS (40 * PRIO_BONUS_RATIO / 100) +#define MAX_BONUS (MAX_USER_PRIO * PRIO_BONUS_RATIO / 100) /* * If a task is 'interactive' then we reinsert it in the active @@ -390,8 +390,6 @@ static inline void activate_task(task_t long sleep_time = jiffies - p->last_run - 1; if (sleep_time > 0) { - unsigned long runtime = jiffies - p->avg_start; - /* * Tasks that sleep a long time are categorised as idle and * will get just under interactive status with a small runtime @@ -402,6 +400,11 @@ static inline void activate_task(task_t p->sleep_avg = MIN_SLEEP_AVG * (MAX_BONUS - INTERACTIVE_DELTA - 2) / MAX_BONUS; } else { + unsigned long runtime = jiffies - p->avg_start; + + if (runtime > MAX_SLEEP_AVG) + runtime = MAX_SLEEP_AVG; + /* * This code gives a bonus to interactive tasks. * _