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

Commit f5f01c78 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "core_ctl: Isolate not_preferred CPUs first during max_cpus limiting"

parents 28b4e3b1 8eaa21fd
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -911,6 +911,7 @@ static void try_to_isolate(struct cluster_data *cluster, unsigned int need)
	unsigned long flags;
	unsigned int num_cpus = cluster->num_cpus;
	unsigned int nr_isolated = 0;
	bool first_pass = cluster->nr_not_preferred_cpus;

	/*
	 * Protect against entry being removed (and added at tail) by other
@@ -956,6 +957,7 @@ static void try_to_isolate(struct cluster_data *cluster, unsigned int need)
	cluster->nr_isolated_cpus += nr_isolated;
	spin_unlock_irqrestore(&state_lock, flags);

again:
	/*
	 * If the number of active CPUs is within the limits, then
	 * don't force isolation of any busy CPUs.
@@ -975,6 +977,9 @@ static void try_to_isolate(struct cluster_data *cluster, unsigned int need)
		if (cluster->active_cpus <= cluster->max_cpus)
			break;

		if (first_pass && !c->not_preferred)
			continue;

		spin_unlock_irqrestore(&state_lock, flags);

		pr_debug("Trying to isolate CPU%u\n", c->cpu);
@@ -991,6 +996,10 @@ static void try_to_isolate(struct cluster_data *cluster, unsigned int need)
	cluster->nr_isolated_cpus += nr_isolated;
	spin_unlock_irqrestore(&state_lock, flags);

	if (first_pass && cluster->active_cpus > cluster->max_cpus) {
		first_pass = false;
		goto again;
	}
}

static void __try_to_unisolate(struct cluster_data *cluster,
+2 −0
Original line number Diff line number Diff line
@@ -133,6 +133,8 @@ int cpupri_find(struct cpupri *cp, struct task_struct *p,

		if (lowest_mask) {
			cpumask_and(lowest_mask, &p->cpus_allowed, vec->mask);
			cpumask_andnot(lowest_mask, lowest_mask,
				       cpu_isolated_mask);
			if (drop_nopreempts)
				drop_nopreempt_cpus(lowest_mask);
			/*