[PATCH v4 18/20] Optimize cpu search with hamming weight



From: Gregory Haskins <ghaskins@xxxxxxxxxx>

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 <ghaskins@xxxxxxxxxx>
---

kernel/sched_rt.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)

Index: linux-compile.git/kernel/sched_rt.c
===================================================================
--- linux-compile.git.orig/kernel/sched_rt.c 2007-11-20 19:53:13.000000000 -0500
+++ linux-compile.git/kernel/sched_rt.c 2007-11-20 19:53:15.000000000 -0500
@@ -300,7 +300,7 @@ static int find_lowest_cpus(struct task_
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);
@@ -313,7 +313,7 @@ static int find_lowest_cpus(struct task_

/* 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;
@@ -325,14 +325,17 @@ static int find_lowest_cpus(struct task_
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)
@@ -356,9 +359,17 @@ static int find_lowest_rq(struct task_st
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 linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • Re: 2.6.8-rc3-mm1
    ... -static struct task_struct * __init ... * Bring one cpu online. ... do_boot_cpu (int sapicid, int cpu) ... static void __init smp_create_idle ...
    (Linux-Kernel)
  • [PATCH] Hotplug CPU toy for i386
    ... Ignore timer interrupt on offline cpu. ... +static inline void play_dead ... +static int __devinit cpu_enable(unsigned int cpu) ...
    (Linux-Kernel)
  • [PATCH 21/35] cpumask: for_each_cpu(): for_each_cpu_mask which takes a pointer
    ... If this cpu gets work to do, ... struct sched_group *sg; ... int cpu, i; ... #ifdef CONFIG_SCHED_SMT ...
    (Linux-Kernel)
  • Re: 2.6.8-rc3-mm1
    ... > - Dropped the staircase scheduler, mainly because the schedstats patch broke ... another cpu via the SMP trampoline, even sharing the stack between cpus. ... static void __init smp_create_idle(unsigned int cpu) ... -static struct task_struct * __devinit ...
    (Linux-Kernel)
  • Re: [Bugme-new] [Bug 9482] New: kernel GPF in 2.6.24 (g09f345da)
    ... Modules linked in: aoe ... a not-possible CPU number. ... int cpu = get_cpu; ... extern int foo; ...
    (Linux-Kernel)