Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=06f90dbd7610d51549004ea9c2ada337831eb292
Commit:     06f90dbd7610d51549004ea9c2ada337831eb292
Parent:     17b3279b48835eb522d842eae16f541da3729c8a
Author:     Gregory Haskins <[EMAIL PROTECTED]>
AuthorDate: Fri Jan 25 21:08:13 2008 +0100
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Fri Jan 25 21:08:13 2008 +0100

    sched: RT-balance, optimize
    
    We can cheaply track the number of bits set in the cpumask for the lowest
    priority CPUs.  Therefore, compute the mask's weight and use it to skip
    the optimal domain search logic when there is only one CPU available.
    
    Signed-off-by: Gregory Haskins <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
---
 kernel/sched_rt.c |   25 ++++++++++++++++++-------
 1 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index 72c8132..52d88f1 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -303,7 +303,7 @@ static int find_lowest_cpus(struct task_struct *task, 
cpumask_t *lowest_mask)
        int       cpu;
        cpumask_t *valid_mask = &__get_cpu_var(valid_cpu_mask);
        int       lowest_prio = -1;
-       int       ret         = 0;
+       int       count       = 0;
 
        cpus_clear(*lowest_mask);
        cpus_and(*valid_mask, cpu_online_map, task->cpus_allowed);
@@ -316,7 +316,7 @@ static int find_lowest_cpus(struct task_struct *task, 
cpumask_t *lowest_mask)
 
                /* We look for lowest RT prio or non-rt CPU */
                if (rq->rt.highest_prio >= MAX_RT_PRIO) {
-                       if (ret)
+                       if (count)
                                cpus_clear(*lowest_mask);
                        cpu_set(rq->cpu, *lowest_mask);
                        return 1;
@@ -328,14 +328,17 @@ static int find_lowest_cpus(struct task_struct *task, 
cpumask_t *lowest_mask)
                        if (rq->rt.highest_prio > lowest_prio) {
                                /* new low - clear old data */
                                lowest_prio = rq->rt.highest_prio;
-                               cpus_clear(*lowest_mask);
+                               if (count) {
+                                       cpus_clear(*lowest_mask);
+                                       count = 0;
+                               }
                        }
                        cpu_set(rq->cpu, *lowest_mask);
-                       ret = 1;
+                       count++;
                }
        }
 
-       return ret;
+       return count;
 }
 
 static inline int pick_optimal_cpu(int this_cpu, cpumask_t *mask)
@@ -359,9 +362,17 @@ static int find_lowest_rq(struct task_struct *task)
        cpumask_t *lowest_mask = &__get_cpu_var(local_cpu_mask);
        int this_cpu = smp_processor_id();
        int cpu      = task_cpu(task);
+       int count    = find_lowest_cpus(task, lowest_mask);
 
-       if (!find_lowest_cpus(task, lowest_mask))
-               return -1;
+       if (!count)
+               return -1; /* No targets found */
+
+       /*
+        * There is no sense in performing an optimal search if only one
+        * target is found.
+        */
+       if (count == 1)
+               return first_cpu(*lowest_mask);
 
        /*
         * At this point we have built a mask of cpus representing the
-
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