Messages in this thread Patch in this message |  | | From | Thara Gopinath <> | Subject | [Patch v9 4/8] sched/fair: Enable periodic update of average thermal pressure | Date | Tue, 28 Jan 2020 17:36:03 -0500 |
| |
Introduce support in scheduler periodic tick and other CFS bookkeeping apis to trigger the process of computing average thermal pressure for a cpu. Also consider avg_thermal.load_avg in others_have_blocked which allows for decay of pelt signals.
Signed-off-by: Thara Gopinath <thara.gopinath@linaro.org> ---
v8->v9: - Moved periodic triggering of thermal pressure averaging from CFS tick function to generic scheduler core tick function.
kernel/sched/core.c | 3 +++ kernel/sched/fair.c | 5 +++++ 2 files changed, 8 insertions(+)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index fc1dfc0..b921795 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -3594,12 +3594,15 @@ void scheduler_tick(void) struct rq *rq = cpu_rq(cpu); struct task_struct *curr = rq->curr; struct rq_flags rf; + unsigned long thermal_pressure; sched_clock_tick(); rq_lock(rq, &rf); update_rq_clock(rq); + thermal_pressure = arch_cpu_thermal_pressure(cpu_of(rq)); + update_thermal_load_avg(rq_clock_task(rq), rq, thermal_pressure); curr->sched_class->task_tick(rq, curr, 0); calc_global_load_tick(rq); psi_task_tick(rq); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index ebf5095..5f58c03 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7491,6 +7491,9 @@ static inline bool others_have_blocked(struct rq *rq) if (READ_ONCE(rq->avg_dl.util_avg)) return true; + if (thermal_load_avg(rq)) + return true; + #ifdef CONFIG_HAVE_SCHED_AVG_IRQ if (READ_ONCE(rq->avg_irq.util_avg)) return true; @@ -7516,6 +7519,7 @@ static bool __update_blocked_others(struct rq *rq, bool *done) { const struct sched_class *curr_class; u64 now = rq_clock_pelt(rq); + unsigned long thermal_pressure = arch_cpu_thermal_pressure(cpu_of(rq)); bool decayed; /* @@ -7526,6 +7530,7 @@ static bool __update_blocked_others(struct rq *rq, bool *done) decayed = update_rt_rq_load_avg(now, rq, curr_class == &rt_sched_class) | update_dl_rq_load_avg(now, rq, curr_class == &dl_sched_class) | + update_thermal_load_avg(rq_clock_task(rq), rq, thermal_pressure) | update_irq_load_avg(rq, 0); if (others_have_blocked(rq)) -- 2.1.4
|  |