[PATCH v3 11/17] RT: Break out the search function

Steven Rostedt
2007-11-17T06:29:10Z

[-- Attachment #1: 0003-rt-balance-break-out-search.patch --]
[-- Type: text/plain, Size: 2676 bytes --]

From: Gregory Haskins <ghaskins@novell.com>

Isolate the search logic into a function so that it can be used later
in places other than find_locked_lowest_rq().

Signed-off-by: Gregory Haskins <ghaskins@novell.com>
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
---

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

Index: linux-compile.git/kernel/sched_rt.c
===================================================================
--- linux-compile.git.orig/kernel/sched_rt.c 2007-11-16 22:23:39.000000000 -0500
+++ linux-compile.git/kernel/sched_rt.c 2007-11-16 22:23:43.000000000 -0500
@@ -256,43 +256,55 @@ static struct task_struct *pick_next_hig
return next;
}

-/* Will lock the rq it finds */
-static struct rq *find_lock_lowest_rq(struct task_struct *task,
- struct rq *rq)
+static int find_lowest_rq(struct task_struct *task)
{
- struct rq *lowest_rq = NULL;
- cpumask_t cpu_mask;
int cpu;
- int tries;
+ cpumask_t cpu_mask;
+ struct rq *lowest_rq = NULL;

cpus_and(cpu_mask, cpu_online_map, task->cpus_allowed);

- for (tries = 0; tries < RT_MAX_TRIES; tries++) {
- /*
- * Scan each rq for the lowest prio.
- */
- for_each_cpu_mask(cpu, cpu_mask) {
- struct rq *curr_rq = &per_cpu(runqueues, cpu);
+ /*
+ * Scan each rq for the lowest prio.
+ */
+ for_each_cpu_mask(cpu, cpu_mask) {
+ struct rq *rq = cpu_rq(cpu);

- if (cpu == rq->cpu)
- continue;
+ if (cpu == rq->cpu)
+ continue;

- /* We look for lowest RT prio or non-rt CPU */
- if (curr_rq->rt.highest_prio >= MAX_RT_PRIO) {
- lowest_rq = curr_rq;
- break;
- }
+ /* We look for lowest RT prio or non-rt CPU */
+ if (rq->rt.highest_prio >= MAX_RT_PRIO) {
+ lowest_rq = rq;
+ break;
+ }

- /* no locking for now */
- if (curr_rq->rt.highest_prio > task->prio &&
- (!lowest_rq || curr_rq->rt.highest_prio > lowest_rq->rt.highest_prio)) {
- lowest_rq = curr_rq;
- }
+ /* no locking for now */
+ if (rq->rt.highest_prio > task->prio &&
+ (!lowest_rq || rq->rt.highest_prio > lowest_rq->rt.highest_prio)) {
+ lowest_rq = rq;
}
+ }
+
+ return lowest_rq ? lowest_rq->cpu : -1;
+}
+
+/* Will lock the rq it finds */
+static struct rq *find_lock_lowest_rq(struct task_struct *task,
+ struct rq *rq)
+{
+ struct rq *lowest_rq = NULL;
+ int cpu;
+ int tries;
+
+ for (tries = 0; tries < RT_MAX_TRIES; tries++) {
+ cpu = find_lowest_rq(task);

- if (!lowest_rq)
+ if (cpu == -1)
break;

+ lowest_rq = cpu_rq(cpu);
+
/* if the prio of this runqueue changed, try again */
if (double_lock_balance(rq, lowest_rq)) {
/*

--