Messages in this thread Patch in this message | | | Date | Mon, 18 Jun 2007 10:59:21 -0700 (PDT) | From | Christoph Lameter <> | Subject | Re: v2.6.21.4-rt11 |
| |
On Mon, 18 Jun 2007, Srivatsa Vaddagiri wrote:
> On Mon, Jun 18, 2007 at 09:54:18AM -0700, Christoph Lameter wrote: > > The nodes-level domain looks for internode balances between up to 16 > > nodes. It is not restricted to a single node. > > I was mostly speaking with the example system in mind (4-node 4-cpu > box), but yes, node-level domain does look for imbalance across max 16 > nodes as you mention. > > Both node and all-node domains don't have SD_BALANCE_NEWIDLE set, which > means idle_balance() will stop looking for imbalance beyonds its own > node. Based on the observed balance within its own node, IMO, > idle_balance() should not cause ->next_balance to be reset.
I think the check in idle_balance needs to be modified.
If the domain *does not* have SD_BALANCE_NEWIDLE set then next_balance must still be set right. Does this patch fix it?
Scheduler: Fix next_interval determination in idle_balance().
The intervals of domains that do not have SD_BALANCE_NEWIDLE must be considered for the calculation of the time of the next balance. Otherwise we may defer rebalancing forever.
Signed-off-by: Christop Lameter <clameter@sgi.com>
Index: linux-2.6.22-rc4-mm2/kernel/sched.c =================================================================== --- linux-2.6.22-rc4-mm2.orig/kernel/sched.c 2007-06-18 10:56:31.000000000 -0700 +++ linux-2.6.22-rc4-mm2/kernel/sched.c 2007-06-18 10:57:10.000000000 -0700 @@ -2493,17 +2493,16 @@ static void idle_balance(int this_cpu, s unsigned long next_balance = jiffies + 60 * HZ; for_each_domain(this_cpu, sd) { - if (sd->flags & SD_BALANCE_NEWIDLE) { + if (sd->flags & SD_BALANCE_NEWIDLE) /* If we've pulled tasks over stop searching: */ pulled_task = load_balance_newidle(this_cpu, this_rq, sd); - if (time_after(next_balance, - sd->last_balance + sd->balance_interval)) - next_balance = sd->last_balance - + sd->balance_interval; - if (pulled_task) - break; - } + if (time_after(next_balance, + sd->last_balance + sd->balance_interval)) + next_balance = sd->last_balance + + sd->balance_interval; + if (pulled_task) + break; } if (!pulled_task) /* - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |