linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Lukasz Luba <lukasz.luba@arm.com>
To: linux-kernel@vger.kernel.org
Cc: Chris.Redpath@arm.com, lukasz.luba@arm.com,
	dietmar.eggemann@arm.com, morten.rasmussen@arm.com,
	qperret@google.com, linux-pm@vger.kernel.org,
	peterz@infradead.org, rjw@rjwysocki.net, viresh.kumar@linaro.org,
	vincent.guittot@linaro.org, mingo@redhat.com,
	juri.lelli@redhat.com, rostedt@goodmis.org, segall@google.com,
	mgorman@suse.de, bristot@redhat.com, CCj.Yeh@mediatek.com
Subject: [PATCH 3/3] PM: EM: Increase energy calculation precision
Date: Fri, 25 Jun 2021 16:26:03 +0100	[thread overview]
Message-ID: <20210625152603.25960-4-lukasz.luba@arm.com> (raw)
In-Reply-To: <20210625152603.25960-1-lukasz.luba@arm.com>

The Energy Model (EM) provides useful information about device power in
each performance state to other subsystems like: Energy Aware Scheduler
(EAS). The energy calculation in EAS does arithmetic operation based on
the EM em_cpu_energy(). Current implementation of that function uses
em_perf_state::cost as a pre-computed cost coefficient equal to:
cost = power * max_frequency / frequency.
The 'power' is expressed in milli-Watts (or in abstract scale).

There are corner cases then the EAS energy calculation for two Performance
Domains (PDs) return the same value, e.g. 10mW. The EAS compares these
values to choose smaller one. It might happen that this values are equal
due to rounding error. In such scenario, we need better precision, e.g.
10000 times better. To provide this possibility increase the precision on
the em_perf_state::cost.

This patch allows to avoid the rounding to milli-Watt errors, which might
occur in EAS energy estimation for each Performance Domains (PD). The
rounding error is common for small tasks which have small utilization
values.

The rest of the EM code doesn't change, em_perf_state::power is still
expressed in milli-Watts (or in abstract scale). Thus, all existing
platforms don't have to change their reported power. The same applies to
EM clients, like thermal or DTPM (they use em_perf_state::power).

Reported-by: CCJ Yeh <CCj.Yeh@mediatek.com>
Suggested-by: CCJ Yeh <CCj.Yeh@mediatek.com>
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
---
 include/linux/energy_model.h | 5 ++++-
 kernel/power/energy_model.c  | 3 ++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/include/linux/energy_model.h b/include/linux/energy_model.h
index 2016f5a706e0..91037dd57e61 100644
--- a/include/linux/energy_model.h
+++ b/include/linux/energy_model.h
@@ -16,7 +16,10 @@
  * @power:	The power consumed at this level (by 1 CPU or by a registered
  *		device). It can be a total power: static and dynamic.
  * @cost:	The cost coefficient associated with this level, used during
- *		energy calculation. Equal to: power * max_frequency / frequency
+ *		energy calculation. Equal to:
+		power * 10000 * max_frequency / frequency
+ *		To increase the energy estimation presision use different
+ *		scale in this coefficient than in @power field.
  */
 struct em_perf_state {
 	unsigned long frequency;
diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c
index 0f4530b3a8cd..2724f0ac417d 100644
--- a/kernel/power/energy_model.c
+++ b/kernel/power/energy_model.c
@@ -170,7 +170,8 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
 	/* Compute the cost of each performance state. */
 	fmax = (u64) table[nr_states - 1].frequency;
 	for (i = 0; i < nr_states; i++) {
-		table[i].cost = div64_u64(fmax * table[i].power,
+		u64 power_res = (u64)table[i].power * 10000;
+		table[i].cost = div64_u64(fmax * power_res,
 					  table[i].frequency);
 	}
 
-- 
2.17.1


  parent reply	other threads:[~2021-06-25 15:26 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-25 15:26 [PATCH 0/3] Improve EAS energy estimation and increase precision Lukasz Luba
2021-06-25 15:26 ` [PATCH 1/3] sched/fair: Prepare variables for increased precision of EAS estimated energy Lukasz Luba
2021-06-30 17:01   ` Rafael J. Wysocki
2021-06-30 17:28     ` Lukasz Luba
2021-07-02 19:07       ` Lukasz Luba
2021-07-07  7:07   ` Vincent Guittot
2021-07-07  7:49     ` Lukasz Luba
2021-07-07  8:00       ` Vincent Guittot
2021-07-07  8:23         ` Lukasz Luba
2021-07-07  9:37           ` Vincent Guittot
2021-07-07  9:48             ` Lukasz Luba
2021-07-07  9:56               ` Vincent Guittot
2021-07-07 10:06                 ` Lukasz Luba
2021-07-07 10:11                   ` Vincent Guittot
2021-07-07 10:29                     ` Lukasz Luba
2021-07-07 10:32                       ` Vincent Guittot
2021-07-07 10:41                         ` Lukasz Luba
2021-07-07 10:50                           ` Vincent Guittot
2021-07-07 11:02                             ` Lukasz Luba
2021-07-07 13:53                               ` Vincent Guittot
2021-07-07 14:25                                 ` Lukasz Luba
2021-07-07  9:45           ` Dietmar Eggemann
2021-07-07  9:54             ` Lukasz Luba
2021-06-25 15:26 ` [PATCH 2/3] PM: EM: Make em_cpu_energy() able to return bigger values Lukasz Luba
2021-07-05 12:44   ` Dietmar Eggemann
2021-07-06 19:44     ` Lukasz Luba
2021-07-07  7:07   ` Peter Zijlstra
2021-07-07  8:09     ` Lukasz Luba
2021-07-07 10:01       ` Peter Zijlstra
2021-07-07 10:23         ` Lukasz Luba
2021-06-25 15:26 ` Lukasz Luba [this message]
2021-07-05 12:45   ` [PATCH 3/3] PM: EM: Increase energy calculation precision Dietmar Eggemann
2021-07-06 19:51     ` Lukasz Luba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210625152603.25960-4-lukasz.luba@arm.com \
    --to=lukasz.luba@arm.com \
    --cc=CCj.Yeh@mediatek.com \
    --cc=Chris.Redpath@arm.com \
    --cc=bristot@redhat.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=juri.lelli@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mgorman@suse.de \
    --cc=mingo@redhat.com \
    --cc=morten.rasmussen@arm.com \
    --cc=peterz@infradead.org \
    --cc=qperret@google.com \
    --cc=rjw@rjwysocki.net \
    --cc=rostedt@goodmis.org \
    --cc=segall@google.com \
    --cc=vincent.guittot@linaro.org \
    --cc=viresh.kumar@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).