public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
To: Peter Williams <pwil3058@bigpond.net.au>
Cc: Andrew Morton <akpm@osdl.org>, Con Kolivas <kernel@kolivas.org>,
	"Chen, Kenneth W" <kenneth.w.chen@intel.com>,
	Ingo Molnar <mingo@elte.hu>, Mike Galbraith <efault@gmx.de>,
	Nick Piggin <nickpiggin@yahoo.com.au>,
	"Siddha, Suresh B" <suresh.b.siddha@intel.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] sched: modify move_tasks() to improve load balancing outcomes
Date: Thu, 13 Apr 2006 16:51:17 -0700	[thread overview]
Message-ID: <20060413165117.A15723@unix-os.sc.intel.com> (raw)
In-Reply-To: <443DF64B.5060305@bigpond.net.au>; from pwil3058@bigpond.net.au on Thu, Apr 13, 2006 at 04:57:15PM +1000

On Thu, Apr 13, 2006 at 04:57:15PM +1000, Peter Williams wrote:
> 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: 

with previous load balancer code it was a good point.. because all tasks
were weighted the same from load balancer perspective.. but now the
imbalance represents what task to move (atleast in the working
cases :)

> 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.

you mean the highest priority task on the current active list of the new 
run queue, right?

There will be some unnecessary movements of high priority tasks because of
this...

thanks,
suresh

> 
> 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

> 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++;

Peter, Are you sure that this is a converging solution? If we want to

  reply	other threads:[~2006-04-13 23:52 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060413165117.A15723@unix-os.sc.intel.com \
    --to=suresh.b.siddha@intel.com \
    --cc=akpm@osdl.org \
    --cc=efault@gmx.de \
    --cc=kenneth.w.chen@intel.com \
    --cc=kernel@kolivas.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=nickpiggin@yahoo.com.au \
    --cc=pwil3058@bigpond.net.au \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox