[v6,5/7] sched/fair: update cpu_capacity to reflect thermal pressure

Message ID 1576123908-12105-6-git-send-email-thara.gopinath@linaro.org
State New
Headers show
Series
  • Introduce Thermal Pressure
Related show

Commit Message

Thara Gopinath Dec. 12, 2019, 4:11 a.m.
cpu_capacity relflects the maximum available capacity of a cpu. Thermal
pressure on a cpu means this maximum available capacity is reduced. This
patch reduces the average thermal pressure for a cpu from its maximum
available capacity so that cpu_capacity reflects the actual
available capacity.

Signed-off-by: Thara Gopinath <thara.gopinath@linaro.org>

---
 kernel/sched/fair.c | 7 +++++++
 1 file changed, 7 insertions(+)

-- 
2.1.4

Comments

Dietmar Eggemann Dec. 17, 2019, 12:54 p.m. | #1
On 12/12/2019 05:11, Thara Gopinath wrote:
> cpu_capacity relflects the maximum available capacity of a cpu. Thermal


s/relflects/reflects

[...]

> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c

> index e12a375..4840655 100644

> --- a/kernel/sched/fair.c

> +++ b/kernel/sched/fair.c

> @@ -7725,8 +7725,15 @@ static unsigned long scale_rt_capacity(struct sched_domain *sd, int cpu)

>  	if (unlikely(irq >= max))

>  		return 1;

>  

> +	/*

> +	 * avg_rt.util avg and avg_dl.util track binary signals

> +	 * (running and not running) with weights 0 and 1024 respectively.


What exactly is this weight here? I assume the 'unsigned long load'
parameter of ___update_load_avg(). At least this would match its use in
__update_load_avg_se().

[...]
Ionela Voinescu Dec. 23, 2019, 5:52 p.m. | #2
On Wednesday 11 Dec 2019 at 23:11:46 (-0500), Thara Gopinath wrote:
> cpu_capacity relflects the maximum available capacity of a cpu. Thermal

> pressure on a cpu means this maximum available capacity is reduced. This

> patch reduces the average thermal pressure for a cpu from its maximum


Maybe we can introduce two terms here: maximum possible capacity and
maximum currently available capacity.
I think using these two terms the message can become more clear:

cpu_capacity initially reflects the maximum possible capacity of a cpu
(capacity orig). Thermal pressure on a cpu means this maximum
possible capacity of a cpu is not available due to thermal events.
This patch subtracts the average thermal pressure for a cpu from the
cpu's maximum possible capacity so that cpu_capacity reflects the
actual maximum currently available capacity.

Kind regards,
Ionela.

> available capacity so that cpu_capacity reflects the actual

> available capacity.

> 

> Signed-off-by: Thara Gopinath <thara.gopinath@linaro.org>

> ---

>  kernel/sched/fair.c | 7 +++++++

>  1 file changed, 7 insertions(+)

> 

> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c

> index e12a375..4840655 100644

> --- a/kernel/sched/fair.c

> +++ b/kernel/sched/fair.c

> @@ -7725,8 +7725,15 @@ static unsigned long scale_rt_capacity(struct sched_domain *sd, int cpu)

>  	if (unlikely(irq >= max))

>  		return 1;

>  

> +	/*

> +	 * avg_rt.util avg and avg_dl.util track binary signals

> +	 * (running and not running) with weights 0 and 1024 respectively.

> +	 * avg_thermal.load_avg tracks thermal pressure and the weighted

> +	 * average uses the actual delta max capacity.

> +	 */

>  	used = READ_ONCE(rq->avg_rt.util_avg);

>  	used += READ_ONCE(rq->avg_dl.util_avg);

> +	used += READ_ONCE(rq->avg_thermal.load_avg);

>  

>  	if (unlikely(used >= max))

>  		return 1;

> -- 

> 2.1.4

>

Patch

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index e12a375..4840655 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -7725,8 +7725,15 @@  static unsigned long scale_rt_capacity(struct sched_domain *sd, int cpu)
 	if (unlikely(irq >= max))
 		return 1;
 
+	/*
+	 * avg_rt.util avg and avg_dl.util track binary signals
+	 * (running and not running) with weights 0 and 1024 respectively.
+	 * avg_thermal.load_avg tracks thermal pressure and the weighted
+	 * average uses the actual delta max capacity.
+	 */
 	used = READ_ONCE(rq->avg_rt.util_avg);
 	used += READ_ONCE(rq->avg_dl.util_avg);
+	used += READ_ONCE(rq->avg_thermal.load_avg);
 
 	if (unlikely(used >= max))
 		return 1;