Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=92c4ca5c3a5e180e9762438db235f41d192cb955
Commit:     92c4ca5c3a5e180e9762438db235f41d192cb955
Parent:     849663430268db63a9c3c7467984e4e530ded901
Author:     Christoph Lameter <[EMAIL PROTECTED]>
AuthorDate: Sat Jun 23 17:16:33 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Sun Jun 24 08:59:11 2007 -0700

    sched: 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.
    
    Siddha also spotted that the conversion of the balance interval
    to jiffies is missing. Fix that to.
    
    From: Srivatsa Vaddagiri <[EMAIL PROTECTED]>
    
    also continue the loop if !(sd->flags & SD_LOAD_BALANCE).
    
    Tested-by: Paul E. McKenney <[EMAIL PROTECTED]>
    
    It did in fact trigger under all three of mainline, CFS, and -rt including 
CFS
    -- see below for a couple of emails from last Friday giving results for 
these
    three on the AMD box (where it happened) and on a single-quad NUMA-Q system
    (where it did not, at least not with such severity).
    
    Signed-off-by: Christoph Lameter <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Cc: <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 kernel/sched.c |   22 +++++++++++++---------
 1 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/kernel/sched.c b/kernel/sched.c
index a747591..50e1a31 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -2938,17 +2938,21 @@ static void idle_balance(int this_cpu, struct rq 
*this_rq)
        unsigned long next_balance = jiffies + 60 *  HZ;
 
        for_each_domain(this_cpu, sd) {
-               if (sd->flags & SD_BALANCE_NEWIDLE) {
+               unsigned long interval;
+
+               if (!(sd->flags & SD_LOAD_BALANCE))
+                       continue;
+
+               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;
-               }
+                                                               this_rq, sd);
+
+               interval = msecs_to_jiffies(sd->balance_interval);
+               if (time_after(next_balance, sd->last_balance + interval))
+                       next_balance = sd->last_balance + interval;
+               if (pulled_task)
+                       break;
        }
        if (!pulled_task)
                /*
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to