summaryrefslogtreecommitdiffstats
path: root/meta-eas/recipes-kernel/linux/linux-renesas/0055-sched-Estimate-energy-impact-of-scheduling-decisions.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-eas/recipes-kernel/linux/linux-renesas/0055-sched-Estimate-energy-impact-of-scheduling-decisions.patch')
-rw-r--r--meta-eas/recipes-kernel/linux/linux-renesas/0055-sched-Estimate-energy-impact-of-scheduling-decisions.patch84
1 files changed, 84 insertions, 0 deletions
diff --git a/meta-eas/recipes-kernel/linux/linux-renesas/0055-sched-Estimate-energy-impact-of-scheduling-decisions.patch b/meta-eas/recipes-kernel/linux/linux-renesas/0055-sched-Estimate-energy-impact-of-scheduling-decisions.patch
new file mode 100644
index 0000000..f6fc44d
--- /dev/null
+++ b/meta-eas/recipes-kernel/linux/linux-renesas/0055-sched-Estimate-energy-impact-of-scheduling-decisions.patch
@@ -0,0 +1,84 @@
+From 9994534fcf8c013f6dfbb017055a3be2c8f48a0f Mon Sep 17 00:00:00 2001
+From: Morten Rasmussen <morten.rasmussen@arm.com>
+Date: Tue, 6 Jan 2015 17:34:05 +0000
+Subject: [PATCH 55/92] sched: Estimate energy impact of scheduling decisions
+
+Adds a generic energy-aware helper function, energy_diff(), that
+calculates energy impact of adding, removing, and migrating utilization
+in the system.
+
+cc: Ingo Molnar <mingo@redhat.com>
+cc: Peter Zijlstra <peterz@infradead.org>
+Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com>
+(cherry picked from commit 6f19a2b0b118f6551e22cf21c1230040a3c4f8a1)
+Signed-off-by: Gaku Inami <gaku.inami.xw@bp.renesas.com>
+---
+ kernel/sched/fair.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 52 insertions(+)
+
+diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
+index dcc73d8..dc1fca0 100644
+--- a/kernel/sched/fair.c
++++ b/kernel/sched/fair.c
+@@ -5522,6 +5522,58 @@ static int sched_group_energy(struct energy_env *eenv)
+ return 0;
+ }
+
++static inline bool cpu_in_sg(struct sched_group *sg, int cpu)
++{
++ return cpu != -1 && cpumask_test_cpu(cpu, sched_group_cpus(sg));
++}
++
++/*
++ * energy_diff(): Estimate the energy impact of changing the utilization
++ * distribution. eenv specifies the change: utilisation amount, source, and
++ * destination cpu. Source or destination cpu may be -1 in which case the
++ * utilization is removed from or added to the system (e.g. task wake-up). If
++ * both are specified, the utilization is migrated.
++ */
++static int energy_diff(struct energy_env *eenv)
++{
++ struct sched_domain *sd;
++ struct sched_group *sg;
++ int sd_cpu = -1, energy_before = 0, energy_after = 0;
++
++ struct energy_env eenv_before = {
++ .util_delta = 0,
++ .src_cpu = eenv->src_cpu,
++ .dst_cpu = eenv->dst_cpu,
++ };
++
++ if (eenv->src_cpu == eenv->dst_cpu)
++ return 0;
++
++ sd_cpu = (eenv->src_cpu != -1) ? eenv->src_cpu : eenv->dst_cpu;
++ sd = rcu_dereference(per_cpu(sd_ea, sd_cpu));
++
++ if (!sd)
++ return 0; /* Error */
++
++ sg = sd->groups;
++
++ do {
++ if (cpu_in_sg(sg, eenv->src_cpu) || cpu_in_sg(sg, eenv->dst_cpu)) {
++ eenv_before.sg_top = eenv->sg_top = sg;
++
++ if (sched_group_energy(&eenv_before))
++ return 0; /* Invalid result abort */
++ energy_before += eenv_before.energy;
++
++ if (sched_group_energy(eenv))
++ return 0; /* Invalid result abort */
++ energy_after += eenv->energy;
++ }
++ } while (sg = sg->next, sg != sd->groups);
++
++ return energy_after-energy_before;
++}
++
+ /*
+ * Detect M:N waker/wakee relationships via a switching-frequency heuristic.
+ *
+--
+1.9.1
+