Skip to content

Commit

Permalink
sched: RT-balance, optimize
Browse files Browse the repository at this point in the history
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@novell.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Gregory Haskins authored and Ingo Molnar committed Jan 25, 2008
1 parent 17b3279 commit 06f90db
Showing 1 changed file with 18 additions and 7 deletions.
25 changes: 18 additions & 7 deletions kernel/sched_rt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -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)
Expand All @@ -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
Expand Down

0 comments on commit 06f90db

Please sign in to comment.