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

Commit 8eaa21fd authored by Pavankumar Kondeti's avatar Pavankumar Kondeti Committed by Satya Durga Srinivasu Prabhala
Browse files

core_ctl: Isolate not_preferred CPUs first during max_cpus limiting



When CPUs are limited via max_cpus tunable, core_ctl first try
to isolate the non busy CPUs. During this, not_preferred CPUs are
skipped. If more CPUs have to be isolated, CPUs are isolated
in the sequential order without checking not_preferred hint.
So we may end up keeping not_preferred CPUs active after this
step. Add another step to isolate the not_preferred CPUs first
during max_cpus limiting.

Change-Id: If2c5c9d9c69718c1e586cd81c1af0ed0b5d13075
Signed-off-by: default avatarPavankumar Kondeti <pkondeti@codeaurora.org>
parent 378f1726
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,