--- linux-2.6.0-test1-mm1/kernel/sched.c 2003-07-16 20:27:32.000000000 +1000 +++ linux-2.6.0-testck1/kernel/sched.c 2003-07-17 00:13:24.000000000 +1000 @@ -76,9 +76,9 @@ #define MIN_SLEEP_AVG (HZ) #define MAX_SLEEP_AVG (10*HZ) #define STARVATION_LIMIT (10*HZ) -#define SLEEP_BUFFER (HZ/20) +#define SLEEP_BUFFER (HZ/100) #define NODE_THRESHOLD 125 -#define MAX_BONUS ((MAX_USER_PRIO - MAX_RT_PRIO) * PRIO_BONUS_RATIO / 100) +#define MAX_BONUS (40 * PRIO_BONUS_RATIO / 100) /* * If a task is 'interactive' then we reinsert it in the active @@ -399,7 +399,7 @@ static inline void activate_task(task_t */ if (sleep_time > MIN_SLEEP_AVG){ p->avg_start = jiffies - MIN_SLEEP_AVG; - p->sleep_avg = MIN_SLEEP_AVG * (MAX_BONUS - INTERACTIVE_DELTA - 1) / + p->sleep_avg = MIN_SLEEP_AVG * (MAX_BONUS - INTERACTIVE_DELTA - 2) / MAX_BONUS; } else { /* @@ -413,14 +413,10 @@ static inline void activate_task(task_t p->sleep_avg += sleep_time; /* - * Give a bonus to tasks that wake early on to prevent - * the problem of the denominator in the bonus equation - * from continually getting larger. + * Processes that sleep get pushed to a higher priority + * each time they sleep */ - if ((runtime - MIN_SLEEP_AVG) < MAX_SLEEP_AVG) - p->sleep_avg += (runtime - p->sleep_avg) * - (MAX_SLEEP_AVG + MIN_SLEEP_AVG - runtime) * - (MAX_BONUS - INTERACTIVE_DELTA) / MAX_BONUS / MAX_SLEEP_AVG; + p->sleep_avg = (p->sleep_avg * MAX_BONUS / runtime + 1) * runtime / MAX_BONUS; /* * Keep a small buffer of SLEEP_BUFFER sleep_avg to @@ -1311,7 +1307,7 @@ void scheduler_tick(int user_ticks, int enqueue_task(p, rq->expired); } else enqueue_task(p, rq->active); - } else if (unlikely(p->prio < effective_prio(p))){ + } else if (p->prio < effective_prio(p)){ /* * Tasks that have lowered their priority are put to the end * of the active array with their remaining timeslice