public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sched: modify move_tasks() to improve load balancing outcomes
@ 2006-04-13  6:57 Peter Williams
  2006-04-13 23:51 ` Siddha, Suresh B
  0 siblings, 1 reply; 9+ messages in thread
From: Peter Williams @ 2006-04-13  6:57 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Con Kolivas, Chen, Kenneth W, Ingo Molnar, Mike Galbraith,
	Nick Piggin, Siddha, Suresh B, Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 1189 bytes --]

Problem:

The move_tasks() function is designed to move UP TO the amount of load 
it is asked to move and in doing this it skips over tasks looking for 
ones whose load weights are less than or equal to the remaining load to 
be moved.  This is (in general) a good thing but it has the unfortunate 
result of breaking one of the original load balancer's good points: 
namely, that (within the limits imposed by the active/expired array 
model and the fact the expired is processed first) it moves high 
priority tasks before low priority ones and this means there's a good 
chance (see active/expired problem for why it's only a chance) that the 
highest priority task on the queue but not actually on the CPU will be 
moved to the other CPU where (as a high priority task) it may preempt 
the current task.

Solution:

Modify move_tasks() so that high priority tasks are not skipped when 
moving them will make them the highest priority task on their new run queue.

Signed-off-by: Peter Williams <pwil3058@bigpond.com.au>

-- 
Peter Williams                                   pwil3058@bigpond.net.au

"Learning, n. The kind of ignorance distinguishing the studious."
  -- Ambrose Bierce

[-- Attachment #2: smpnice-modify-move_tasks --]
[-- Type: text/plain, Size: 1478 bytes --]

Index: MM-2.6.17-rc1-mm2/kernel/sched.c
===================================================================
--- MM-2.6.17-rc1-mm2.orig/kernel/sched.c	2006-04-13 10:53:32.000000000 +1000
+++ MM-2.6.17-rc1-mm2/kernel/sched.c	2006-04-13 11:08:45.000000000 +1000
@@ -2043,7 +2043,7 @@ static int move_tasks(runqueue_t *this_r
 {
 	prio_array_t *array, *dst_array;
 	struct list_head *head, *curr;
-	int idx, pulled = 0, pinned = 0;
+	int idx, pulled = 0, pinned = 0, this_min_prio;
 	long rem_load_move;
 	task_t *tmp;
 
@@ -2052,6 +2052,7 @@ static int move_tasks(runqueue_t *this_r
 
 	rem_load_move = max_load_move;
 	pinned = 1;
+	this_min_prio = this_rq->curr->prio;
 
 	/*
 	 * We first consider expired tasks. Those will likely not be
@@ -2091,7 +2092,12 @@ skip_queue:
 
 	curr = curr->prev;
 
-	if (tmp->load_weight > rem_load_move ||
+	/*
+	 * To help distribute high priority tasks accross CPUs we don't
+	 * skip a task if it will be the highest priority task (i.e. smallest
+	 * prio value) on its new queue regardless of its load weight
+	 */
+	if ((idx >= this_min_prio && tmp->load_weight > rem_load_move) ||
 	    !can_migrate_task(tmp, busiest, this_cpu, sd, idle, &pinned)) {
 		if (curr != head)
 			goto skip_queue;
@@ -2113,6 +2119,8 @@ skip_queue:
 	 * and the prescribed amount of weighted load.
 	 */
 	if (pulled < max_nr_move && rem_load_move > 0) {
+		if (idx < this_min_prio)
+			this_min_prio = idx;
 		if (curr != head)
 			goto skip_queue;
 		idx++;

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2006-04-18  0:18 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-04-13  6:57 [PATCH] sched: modify move_tasks() to improve load balancing outcomes Peter Williams
2006-04-13 23:51 ` Siddha, Suresh B
2006-04-14  1:50   ` Peter Williams
2006-04-14 18:27     ` Siddha, Suresh B
2006-04-15  0:54       ` Peter Williams
2006-04-17 16:59         ` Siddha, Suresh B
2006-04-17 23:21           ` Peter Williams
2006-04-17 23:56           ` Peter Williams
2006-04-18  0:18           ` Peter Williams

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox