Messages in this thread | | | From | Amit Kucheria <> | Date | Thu, 27 Feb 2020 14:33:01 +0530 | Subject | Re: [Patch v10 6/9] sched/fair: Enable periodic update of average thermal pressure |
| |
On Sat, Feb 22, 2020 at 6:22 AM Thara Gopinath <thara.gopinath@linaro.org> wrote: > > 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 as per > Peter's review comments. > > kernel/sched/core.c | 3 +++ > kernel/sched/fair.c | 7 +++++++ > 2 files changed, 10 insertions(+)
Hi Thara,
This patch has a fuzz while applying to v5.6-rc2. Just FYI.
Regards, Amit
> > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index e94819d573be..160b5e9e8945 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -3588,6 +3588,7 @@ void scheduler_tick(void) > struct rq *rq = cpu_rq(cpu); > struct task_struct *curr = rq->curr; > struct rq_flags rf; > + unsigned long thermal_pressure; > > arch_scale_freq_tick(); > sched_clock_tick(); > @@ -3595,6 +3596,8 @@ void scheduler_tick(void) > rq_lock(rq, &rf); > > update_rq_clock(rq); > + thermal_pressure = arch_scale_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 f38ff5a335d3..00b21a5b71f0 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -7536,6 +7536,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; > @@ -7561,6 +7564,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; > bool decayed; > > /* > @@ -7569,8 +7573,11 @@ static bool __update_blocked_others(struct rq *rq, bool *done) > */ > curr_class = rq->curr->sched_class; > > + thermal_pressure = arch_scale_thermal_pressure(cpu_of(rq)); > + > 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.20.1 >
| |