Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d38b223c authored by Mike Travis's avatar Mike Travis Committed by Ingo Molnar
Browse files

cpumask: reduce stack usage in find_lowest_rq



Impact: reduce stack usage, cleanup

Use a cpumask_var_t in find_lowest_rq() and clean up other old
cpumask_t calls.

Signed-off-by: default avatarMike Travis <travis@sgi.com>
parent c90e785b
Loading
Loading
Loading
Loading
+22 −14
Original line number Diff line number Diff line
@@ -960,16 +960,17 @@ static struct task_struct *pick_next_highest_task_rt(struct rq *rq, int cpu)

static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask);

static inline int pick_optimal_cpu(int this_cpu, cpumask_t *mask)
static inline int pick_optimal_cpu(int this_cpu,
				   const struct cpumask *mask)
{
	int first;

	/* "this_cpu" is cheaper to preempt than a remote processor */
	if ((this_cpu != -1) && cpu_isset(this_cpu, *mask))
	if ((this_cpu != -1) && cpumask_test_cpu(this_cpu, mask))
		return this_cpu;

	first = first_cpu(*mask);
	if (first != NR_CPUS)
	first = cpumask_first(mask);
	if (first < nr_cpu_ids)
		return first;

	return -1;
@@ -981,6 +982,7 @@ static int find_lowest_rq(struct task_struct *task)
	struct cpumask *lowest_mask = __get_cpu_var(local_cpu_mask);
	int this_cpu = smp_processor_id();
	int cpu      = task_cpu(task);
	cpumask_var_t domain_mask;

	if (task->rt.nr_cpus_allowed == 1)
		return -1; /* No other targets possible */
@@ -1013,20 +1015,26 @@ static int find_lowest_rq(struct task_struct *task)
	if (this_cpu == cpu)
		this_cpu = -1; /* Skip this_cpu opt if the same */

	if (alloc_cpumask_var(&domain_mask, GFP_ATOMIC)) {
		for_each_domain(cpu, sd) {
			if (sd->flags & SD_WAKE_AFFINE) {
			cpumask_t domain_mask;
				int best_cpu;

			cpumask_and(&domain_mask, sched_domain_span(sd),
				cpumask_and(domain_mask,
					    sched_domain_span(sd),
					    lowest_mask);

				best_cpu = pick_optimal_cpu(this_cpu,
						    &domain_mask);
			if (best_cpu != -1)
							    domain_mask);

				if (best_cpu != -1) {
					free_cpumask_var(domain_mask);
					return best_cpu;
				}
			}
		}
		free_cpumask_var(domain_mask);
	}

	/*
	 * And finally, if there were no matches within the domains