Thermal pressure follows pelt signas which means the decay period for thermal pressure is the default pelt decay period. Depending on soc charecteristics and thermal activity, it might be beneficial to decay thermal pressure slower, but still in-tune with the pelt signals. One way to achieve this is to provide a command line parameter to set the decay coefficient to an integer between 0 and 10.
Signed-off-by: Thara Gopinath <[email protected]> --- v3->v4: - Removed the sysctl setting to tune decay period and instead introduced a command line parameter to control it. The rationale here being changing decay period of a PELT signal runtime can result in a skewed average value for atleast some cycles. Documentation/admin-guide/kernel-parameters.txt | 5 +++++ kernel/sched/thermal.c | 25 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index a84a83f..61d7baa 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -4273,6 +4273,11 @@ incurs a small amount of overhead in the scheduler but is useful for debugging and performance tuning. + sched_thermal_decay_coeff= + [KNL, SMP] Set decay coefficient for thermal pressure signal. + Format: integer betweer 0 and 10 + Default is 0. + skew_tick= [KNL] Offset the periodic timer tick per cpu to mitigate xtime_lock contention on larger systems, and/or RCU lock contention on all systems with CONFIG_MAXSMP set. diff --git a/kernel/sched/thermal.c b/kernel/sched/thermal.c index 0c84960..0da31e1 100644 --- a/kernel/sched/thermal.c +++ b/kernel/sched/thermal.c @@ -10,6 +10,28 @@ #include "pelt.h" #include "thermal.h" +/** + * By default the decay is the default pelt decay period. + * The decay coefficient can change is decay period in + * multiples of 32. + * Decay coefficient Decay period(ms) + * 0 32 + * 1 64 + * 2 128 + * 3 256 + * 4 512 + */ +static int sched_thermal_decay_coeff; + +static int __init setup_sched_thermal_decay_coeff(char *str) +{ + if (kstrtoint(str, 0, &sched_thermal_decay_coeff)) + pr_warn("Unable to set scheduler thermal pressure decay coefficient\n"); + + return 1; +} +__setup("sched_thermal_decay_coeff=", setup_sched_thermal_decay_coeff); + static DEFINE_PER_CPU(unsigned long, delta_capacity); /** @@ -40,6 +62,7 @@ void update_thermal_pressure(int cpu, u64 capped_freq_ratio) */ void trigger_thermal_pressure_average(struct rq *rq) { - update_thermal_load_avg(rq_clock_task(rq), rq, + update_thermal_load_avg(rq_clock_task(rq) >> + sched_thermal_decay_coeff, rq, per_cpu(delta_capacity, cpu_of(rq))); } -- 2.1.4

