Commit 05289b90 authored by Thara Gopinath's avatar Thara Gopinath Committed by Ingo Molnar
Browse files

sched/fair: Enable tuning of decay period



Thermal pressure follows pelt signals which means the decay period for
thermal pressure is the default pelt decay period. Depending on SoC
characteristics 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 a decay
shift parameter to an integer between 0 and 10.

Signed-off-by: default avatarThara Gopinath <thara.gopinath@linaro.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Link: https://lkml.kernel.org/r/20200222005213.3873-10-thara.gopinath@linaro.org
parent f12e4f66
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -4392,6 +4392,22 @@
			incurs a small amount of overhead in the scheduler
			but is useful for debugging and performance tuning.

	sched_thermal_decay_shift=
			[KNL, SMP] Set a decay shift for scheduler thermal
			pressure signal. Thermal pressure signal follows the
			default decay period of other scheduler pelt
			signals(usually 32 ms but configurable). Setting
			sched_thermal_decay_shift will left shift the decay
			period for the thermal pressure signal by the shift
			value.
			i.e. with the default pelt decay period of 32 ms
			sched_thermal_decay_shift   thermal pressure decay pr
				1			64 ms
				2			128 ms
			and so on.
			Format: integer between 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.
+1 −1
Original line number Diff line number Diff line
@@ -3595,7 +3595,7 @@ void scheduler_tick(void)

	update_rq_clock(rq);
	thermal_pressure = arch_scale_thermal_pressure(cpu_of(rq));
	update_thermal_load_avg(rq_clock_task(rq), rq, thermal_pressure);
	update_thermal_load_avg(rq_clock_thermal(rq), rq, thermal_pressure);
	curr->sched_class->task_tick(rq, curr, 0);
	calc_global_load_tick(rq);
	psi_task_tick(rq);
+14 −1
Original line number Diff line number Diff line
@@ -86,6 +86,19 @@ static unsigned int normalized_sysctl_sched_wakeup_granularity = 1000000UL;

const_debug unsigned int sysctl_sched_migration_cost	= 500000UL;

int sched_thermal_decay_shift;
static int __init setup_sched_thermal_decay_shift(char *str)
{
	int _shift = 0;

	if (kstrtoint(str, 0, &_shift))
		pr_warn("Unable to set scheduler thermal pressure decay shift parameter\n");

	sched_thermal_decay_shift = clamp(_shift, 0, 10);
	return 1;
}
__setup("sched_thermal_decay_shift=", setup_sched_thermal_decay_shift);

#ifdef CONFIG_SMP
/*
 * For asym packing, by default the lower numbered CPU has higher priority.
@@ -7760,7 +7773,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_thermal_load_avg(rq_clock_thermal(rq), rq, thermal_pressure) |
		  update_irq_load_avg(rq, 0);

	if (others_have_blocked(rq))
+18 −0
Original line number Diff line number Diff line
@@ -1127,6 +1127,24 @@ static inline u64 rq_clock_task(struct rq *rq)
	return rq->clock_task;
}

/**
 * By default the decay is the default pelt decay period.
 * The decay shift can change the decay period in
 * multiples of 32.
 *  Decay shift		Decay period(ms)
 *	0			32
 *	1			64
 *	2			128
 *	3			256
 *	4			512
 */
extern int sched_thermal_decay_shift;

static inline u64 rq_clock_thermal(struct rq *rq)
{
	return rq_clock_task(rq) >> sched_thermal_decay_shift;
}

static inline void rq_clock_skip_update(struct rq *rq)
{
	lockdep_assert_held(&rq->lock);