Skip to content

Commit

Permalink
[PATCH] sched: correct smp_nice_bias
Browse files Browse the repository at this point in the history
The priority biasing was off by mutliplying the total load by the total
priority bias and this ruins the ratio of loads between runqueues. This
patch should correct the ratios of loads between runqueues to be proportional
to overall load. -2nd attempt.

From: Dave Kleikamp <shaggy@austin.ibm.com>

  This patch fixes a divide-by-zero error that I hit on a two-way i386
  machine.  rq->nr_running is tested to be non-zero, but may change by the
  time it is used in the division.  Saving the value to a local variable
  ensures that the same value that is checked is used in the division.

Signed-off-by: Con Kolivas <kernel@kolivas.org>
Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Con Kolivas authored and Linus Torvalds committed Nov 9, 2005
1 parent 3b0bd9b commit 6dd4a85
Showing 1 changed file with 8 additions and 6 deletions.
14 changes: 8 additions & 6 deletions kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -972,15 +972,16 @@ void kick_process(task_t *p)
static inline unsigned long __source_load(int cpu, int type, enum idle_type idle)
{
runqueue_t *rq = cpu_rq(cpu);
unsigned long running = rq->nr_running;
unsigned long source_load, cpu_load = rq->cpu_load[type-1],
load_now = rq->nr_running * SCHED_LOAD_SCALE;
load_now = running * SCHED_LOAD_SCALE;

if (type == 0)
source_load = load_now;
else
source_load = min(cpu_load, load_now);

if (idle == NOT_IDLE || rq->nr_running > 1)
if (running > 1 || (idle == NOT_IDLE && running))
/*
* If we are busy rebalancing the load is biased by
* priority to create 'nice' support across cpus. When
Expand All @@ -989,7 +990,7 @@ static inline unsigned long __source_load(int cpu, int type, enum idle_type idle
* prevent idle rebalance from trying to pull tasks from a
* queue with only one running task.
*/
source_load *= rq->prio_bias;
source_load = source_load * rq->prio_bias / running;

return source_load;
}
Expand All @@ -1005,16 +1006,17 @@ static inline unsigned long source_load(int cpu, int type)
static inline unsigned long __target_load(int cpu, int type, enum idle_type idle)
{
runqueue_t *rq = cpu_rq(cpu);
unsigned long running = rq->nr_running;
unsigned long target_load, cpu_load = rq->cpu_load[type-1],
load_now = rq->nr_running * SCHED_LOAD_SCALE;
load_now = running * SCHED_LOAD_SCALE;

if (type == 0)
target_load = load_now;
else
target_load = max(cpu_load, load_now);

if (idle == NOT_IDLE || rq->nr_running > 1)
target_load *= rq->prio_bias;
if (running > 1 || (idle == NOT_IDLE && running))
target_load = target_load * rq->prio_bias / running;

return target_load;
}
Expand Down

0 comments on commit 6dd4a85

Please sign in to comment.