In energy_diff trace point, it records payoff so we can know the calculation result for PE filter. In current code, the trace point is recorded in __energy_diff(), but this function is before PE filter calculation, so always we get a stale value for payoff in the stack; As result using tools (like LISA) to get wrong PE filter analysis result.
So this patch is to move energy_diff trace point to function energy_aware_wake_cpu(), so we can gather all correct info and can use trace point well after disable CONFIG_SCHED_TUNE.
Signed-off-by: Leo Yan leo.yan@linaro.org --- kernel/sched/fair.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 793b6e8..785bb8d 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5093,12 +5093,6 @@ static inline int __energy_diff(struct energy_env *eenv) eenv->nrg.diff = eenv->nrg.after - eenv->nrg.before; eenv->payoff = 0;
- trace_sched_energy_diff(eenv->task, - eenv->src_cpu, eenv->dst_cpu, eenv->util_delta, - eenv->nrg.before, eenv->nrg.after, eenv->nrg.diff, - eenv->cap.before, eenv->cap.after, eenv->cap.delta, - eenv->nrg.delta, eenv->payoff); - return eenv->nrg.diff; }
@@ -5752,7 +5746,7 @@ static int energy_aware_wake_cpu(struct task_struct *p, int target, int sync) int target_max_cap = INT_MAX; int target_cpu = task_cpu(p); unsigned long task_util_boosted, new_util; - int i; + int diff, i;
if (sysctl_sched_sync_hint_enable && sync) { int cpu = smp_processor_id(); @@ -5843,6 +5837,7 @@ static int energy_aware_wake_cpu(struct task_struct *p, int target, int sync) }
if (target_cpu != task_cpu(p)) { + struct energy_env eenv = { .util_delta = task_util(p), .src_cpu = task_cpu(p), @@ -5854,7 +5849,15 @@ static int energy_aware_wake_cpu(struct task_struct *p, int target, int sync) if (cpu_overutilized(task_cpu(p))) return target_cpu;
- if (energy_diff(&eenv) >= 0) + diff = energy_diff(&eenv); + + trace_sched_energy_diff(eenv.task, + eenv.src_cpu, eenv.dst_cpu, eenv.util_delta, + eenv.nrg.before, eenv.nrg.after, eenv.nrg.diff, + eenv.cap.before, eenv.cap.after, eenv.cap.delta, + eenv.nrg.delta, eenv.payoff); + + if (diff >= 0) return task_cpu(p); }
-- 1.9.1