On Fri, May 20, 2016 at 12:24:49AM +0800, Leo Yan wrote:
When calculate payoff criteria for performance constraint region, the inequality formula is wrong:
cap_delta / nrg_delta > cap_gain / nrg_gain
Here nrg_delta < 0, so when multiply it both side then should then multiplying nrg_delta inverts the inequality:
nrg_delta * cap_gain > cap_delta * nrg_gain
So finally we can get unified formula for both performance constraint region and performance boost region. So this patch unified these the calculation after fixed inequality formula.
Signed-off-by: Leo Yan leo.yan@linaro.org
kernel/sched/tune.c | 54 ++++++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 25 deletions(-)
diff --git a/kernel/sched/tune.c b/kernel/sched/tune.c index 9d8eeb4..1da85a8 100644 --- a/kernel/sched/tune.c +++ b/kernel/sched/tune.c @@ -58,36 +58,40 @@ __schedtune_accept_deltas(int nrg_delta, int cap_delta, int perf_boost_idx, int perf_constrain_idx) { int payoff = -INT_MAX;
int idx = -1;
/* Performance Boost (B) region */
- if (nrg_delta > 0 && cap_delta > 0) {
/*
* Evaluate "Performance Boost" vs "Energy Increase"
* payoff criteria:
* cap_delta / nrg_delta < cap_gain / nrg_gain
* which is:
* nrg_delta * cap_gain > cap_delta * nrg_gain
*/
payoff = nrg_delta * threshold_gains[perf_boost_idx].cap_gain;
payoff -= cap_delta * threshold_gains[perf_boost_idx].nrg_gain;
return payoff;
- }
- if (nrg_delta > 0 && cap_delta > 0)
/* Performance Constraint (C) region */idx = perf_boost_idx;
- if (nrg_delta < 0 && cap_delta < 0) {
/*
* Evaluate "Performance Boost" vs "Energy Increase"
* payoff criteria:
* cap_delta / nrg_delta > cap_gain / nrg_gain
* which is:
* cap_delta * nrg_gain > nrg_delta * cap_gain
*/
payoff = cap_delta * threshold_gains[perf_constrain_idx].nrg_gain;
payoff -= nrg_delta * threshold_gains[perf_constrain_idx].cap_gain;
return payoff;
- }
else if (nrg_delta < 0 && cap_delta < 0)
idx = perf_constrain_idx;
/* Default: reject schedule candidate */
if (idx == -1)
return payoff;
/*
* Evaluate "Performance Boost" vs "Energy Increase"
*
* - Performance Boost (B) region
*
* Condition: nrg_delta > 0 && cap_delta > 0
* Payoff criteria:
* cap_delta / nrg_delta < cap_gain / nrg_gain =
* nrg_delta * cap_gain > cap_delta * nrg_gain
* (note: nrg_delta > 0, nrg_gain > 0)
*
* - Performance Constraint (C) region
*
* Condition: nrg_delta < 0 && cap_delta < 0
* payoff criteria:
* cap_delta / nrg_delta > cap_gain / nrg_gain =
* nrg_delta * cap_gain > cap_delta * nrg_gain
* (note: nrg_delta < 0, nrg_gain > 0)
*/
payoff = nrg_delta * threshold_gains[perf_boost_idx].cap_gain;
payoff -= cap_delta * threshold_gains[perf_boost_idx].nrg_gain;
Sorry, here should be: + payoff = nrg_delta * threshold_gains[idx].cap_gain; + payoff -= cap_delta * threshold_gains[idx].nrg_gain;
return payoff; }
-- 1.9.1