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

Commit a2129978 authored by Brendan Jackman's avatar Brendan Jackman Committed by Joel Fernandes
Browse files

sched/core: Warn if ENERGY_AWARE is enabled but data is missing



If the EAS energy model is missing or incomplete, i.e. sd_scs is NULL, then
sched_group_energy will return -EINVAL on the assumption that it raced with a
CPU hotplug event. In that case, energy_diff will return 0 and the energy-aware
wake path will silently fail to trigger any migrations.

This case can be triggered by disabling CONFIG_SCHED_MC on existing platforms,
so that there are no sched_groups with the SD_SHARE_CAP_STATES flag, so that
sd_scs is NULL.

Add checks so that a warning is printed if EAS is ever enabled while the
necessary data is not present.

Change-Id: Id233a510b5ad8b7fcecac0b1d789e730bbfc7c4a
Signed-off-by: default avatarBrendan Jackman <brendan.jackman@arm.com>
parent e79f447a
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -91,6 +91,8 @@
#include <trace/events/sched.h>
#include "walt.h"

static bool have_sched_energy_data(void);

DEFINE_MUTEX(sched_domains_mutex);
DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues);

@@ -193,6 +195,10 @@ static int sched_feat_set(char *cmp)
				sysctl_sched_features &= ~(1UL << i);
				sched_feat_disable(i);
			} else {
				if (i == __SCHED_FEAT_ENERGY_AWARE)
					WARN(!have_sched_energy_data(),
					     "Missing sched energy data\n");

				sysctl_sched_features |= (1UL << i);
				sched_feat_enable(i);
			}
@@ -6649,6 +6655,19 @@ static void init_sched_groups_capacity(int cpu, struct sched_domain *sd)
	atomic_set(&sg->sgc->nr_busy_cpus, sg->group_weight);
}

static bool have_sched_energy_data(void)
{
	int cpu;

	for_each_possible_cpu(cpu) {
		if (!rcu_dereference(per_cpu(sd_scs, cpu)) ||
		    !rcu_dereference(per_cpu(sd_ea, cpu)))
			return false;
	}

	return true;
}

/*
 * Check that the per-cpu provided sd energy data is consistent for all cpus
 * within the mask.
@@ -7461,6 +7480,9 @@ static int build_sched_domains(const struct cpumask *cpu_map,
	}
	rcu_read_unlock();

	WARN(sched_feat(ENERGY_AWARE) && !have_sched_energy_data(),
	     "Missing data for energy aware scheduling\n");

	ret = 0;
error:
	__free_domain_allocs(&d, alloc_state, cpu_map);