Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fefafa08 authored by Srivatsa Vaddagiri's avatar Srivatsa Vaddagiri Committed by Steve Muckle
Browse files

sched: remove sysctl control for HMP and power-aware task placement



There is no real need to control HMP and power-aware task placement at
runtime after kernel has booted. Boot-time control should be
sufficient. Not allowing for runtime (sysctl) support simplifies the
code quite a bit.

Also rename sysctl_sched_enable_hmp_task_placement to be shorter.

Change-Id: I60cae51a173c6f73b79cbf90c50ddd41a27604aa
Signed-off-by: default avatarSrivatsa Vaddagiri <vatsa@codeaurora.org>
parent 87df0beb
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -49,7 +49,6 @@ extern int sysctl_sched_freq_dec_notify_slack_pct;
#endif

#ifdef CONFIG_SCHED_HMP
extern unsigned int sysctl_sched_enable_hmp_task_placement;
extern unsigned int sysctl_sched_spill_nr_run;
extern unsigned int sysctl_sched_mostly_idle_nr_run;
extern unsigned int sysctl_sched_spill_load_pct;
@@ -58,7 +57,6 @@ extern unsigned int sysctl_sched_small_task_pct;
extern unsigned int sysctl_sched_upmigrate_pct;
extern unsigned int sysctl_sched_downmigrate_pct;
extern int sysctl_sched_upmigrate_min_nice;
extern unsigned int sysctl_sched_enable_power_aware;
extern unsigned int sysctl_sched_powerband_limit_pct;
extern unsigned int sysctl_sched_boost;

+36 −7
Original line number Diff line number Diff line
@@ -1016,6 +1016,36 @@ void register_task_migration_notifier(struct notifier_block *n)
	atomic_notifier_chain_register(&task_migration_notifier, n);
}

#ifdef CONFIG_SCHED_HMP

static int __init set_sched_enable_hmp(char *str)
{
	int enable_hmp = 0;

	get_option(&str, &enable_hmp);

	sched_enable_hmp = !!enable_hmp;

	return 0;
}

early_param("sched_enable_hmp", set_sched_enable_hmp);

static int __init set_sched_enable_power_aware(char *str)
{
	int enable_power_aware = 0;

	get_option(&str, &enable_power_aware);

	sched_enable_power_aware = !!enable_power_aware;

	return 0;
}

early_param("sched_enable_power_aware", set_sched_enable_power_aware);

#endif	/* CONFIG_SCHED_HMP */

#if defined(CONFIG_SCHED_FREQ_INPUT) || defined(CONFIG_SCHED_HMP)

/* Window size (in ns) */
@@ -1076,7 +1106,7 @@ int rq_freq_margin(struct rq *rq)
	int margin;
	u64 demand;

	if (!sysctl_sched_enable_hmp_task_placement)
	if (!sched_enable_hmp)
		return INT_MAX;

	demand = scale_load_to_cpu(rq->prev_runnable_sum, rq->cpu);
@@ -1334,7 +1364,7 @@ static void init_cpu_efficiency(void)
	int i, efficiency;
	unsigned int max = 0, min = UINT_MAX;

	if (!sysctl_sched_enable_hmp_task_placement)
	if (!sched_enable_hmp)
		return;

	for_each_possible_cpu(i) {
@@ -1377,7 +1407,7 @@ static inline void set_window_start(struct rq *rq)
	int cpu = cpu_of(rq);
	struct rq *sync_rq = cpu_rq(sync_cpu);

	if (rq->window_start || !sysctl_sched_enable_hmp_task_placement)
	if (rq->window_start || !sched_enable_hmp)
		return;

	if (cpu == sync_cpu) {
@@ -1661,7 +1691,7 @@ static int register_sched_callback(void)
{
	int ret;

	if (!sysctl_sched_enable_hmp_task_placement)
	if (!sched_enable_hmp)
		return 0;

	ret = cpufreq_register_notifier(&notifier_policy_block,
@@ -1833,8 +1863,7 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu)

		atomic_notifier_call_chain(&task_migration_notifier, 0, &tmn);

		if (sysctl_sched_enable_hmp_task_placement &&
		    (p->on_rq || p->state == TASK_WAKING))
		if (sched_enable_hmp && (p->on_rq || p->state == TASK_WAKING))
			fixup_busy_time(p, new_cpu);
	}

@@ -3533,7 +3562,7 @@ void sched_exec(void)
	unsigned long flags;
	int dest_cpu;

	if (sysctl_sched_enable_hmp_task_placement)
	if (sched_enable_hmp)
		return;

	raw_spin_lock_irqsave(&p->pi_lock, flags);
+19 −19
Original line number Diff line number Diff line
@@ -1250,7 +1250,7 @@ unsigned int max_task_load(void)
#ifdef CONFIG_SCHED_HMP

/* Use this knob to turn on or off HMP-aware task placement logic */
unsigned int __read_mostly sysctl_sched_enable_hmp_task_placement = 1;
unsigned int __read_mostly sched_enable_hmp = 1;

/* A cpu can no longer accomodate more tasks if:
 *
@@ -1271,7 +1271,7 @@ unsigned int __read_mostly sysctl_sched_mostly_idle_nr_run = 3;
 * Control whether or not individual CPU power consumption is used to
 * guide task placement.
 */
unsigned int __read_mostly sysctl_sched_enable_power_aware = 1;
unsigned int __read_mostly sched_enable_power_aware = 1;

/*
 * This specifies the maximum percent power difference between 2
@@ -1453,7 +1453,7 @@ int sched_set_boost(int enable)
	unsigned long flags;
	int ret = 0;

	if (!sysctl_sched_enable_hmp_task_placement)
	if (!sched_enable_hmp)
		return -EINVAL;

	spin_lock_irqsave(&boost_lock, flags);
@@ -1573,7 +1573,7 @@ unsigned int power_cost_at_freq(int cpu, unsigned int freq)
	struct cpu_pstate_pwr *costs;

	if (!per_cpu_info || !per_cpu_info[cpu].ptable ||
	    !sysctl_sched_enable_power_aware)
	    !sched_enable_power_aware)
		/* When power aware scheduling is not in use, or CPU
		 * power data is not available, just use the CPU
		 * capacity as a rough stand-in for real CPU power
@@ -1604,7 +1604,7 @@ static unsigned int power_cost(struct task_struct *p, int cpu)
	unsigned int task_freq;
	unsigned int cur_freq = cpu_rq(cpu)->cur_freq;

	if (!sysctl_sched_enable_power_aware)
	if (!sched_enable_power_aware)
		return cpu_rq(cpu)->max_possible_capacity;

	/* calculate % of max freq needed */
@@ -1761,7 +1761,7 @@ done:

void inc_nr_big_small_task(struct rq *rq, struct task_struct *p)
{
	if (!sysctl_sched_enable_hmp_task_placement)
	if (!sched_enable_hmp)
		return;

	if (is_big_task(p))
@@ -1772,7 +1772,7 @@ void inc_nr_big_small_task(struct rq *rq, struct task_struct *p)

void dec_nr_big_small_task(struct rq *rq, struct task_struct *p)
{
	if (!sysctl_sched_enable_hmp_task_placement)
	if (!sched_enable_hmp)
		return;

	if (is_big_task(p))
@@ -1840,7 +1840,7 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write,
	unsigned int old_val = *data;

	ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
	if (ret || !write || !sysctl_sched_enable_hmp_task_placement)
	if (ret || !write || !sched_enable_hmp)
		return ret;

	if ((sysctl_sched_downmigrate_pct > sysctl_sched_upmigrate_pct) ||
@@ -1963,7 +1963,7 @@ static inline int migration_needed(struct rq *rq, struct task_struct *p)
	int nice = TASK_NICE(p);

	if (is_small_task(p) || p->state != TASK_RUNNING ||
			!sysctl_sched_enable_hmp_task_placement)
			!sched_enable_hmp)
		return 0;

	/* Todo: cgroup-based control? */
@@ -1974,7 +1974,7 @@ static inline int migration_needed(struct rq *rq, struct task_struct *p)
	if (!task_will_fit(p, cpu_of(rq)))
		return 1;

	if (sysctl_sched_enable_power_aware &&
	if (sched_enable_power_aware &&
	    lower_power_cpu_available(p, cpu_of(rq)))
		return 1;

@@ -2027,7 +2027,7 @@ static inline int nr_big_tasks(struct rq *rq)

#else	/* CONFIG_SCHED_HMP */

#define sysctl_sched_enable_power_aware 0
#define sched_enable_power_aware 0

static inline int select_best_cpu(struct task_struct *p, int target)
{
@@ -2566,7 +2566,7 @@ add_to_scaled_stat(int cpu, struct sched_avg *sa, u64 delta)
	u64 scaled_delta;
	int sf;

	if (!sysctl_sched_enable_hmp_task_placement)
	if (!sched_enable_hmp)
		return;

	if (unlikely(cur_freq > max_possible_freq ||
@@ -2583,7 +2583,7 @@ add_to_scaled_stat(int cpu, struct sched_avg *sa, u64 delta)

static inline void decay_scaled_stat(struct sched_avg *sa, u64 periods)
{
	if (!sysctl_sched_enable_hmp_task_placement)
	if (!sched_enable_hmp)
		return;

	sa->runnable_avg_sum_scaled =
@@ -4369,7 +4369,7 @@ select_task_rq_fair(struct task_struct *p, int sd_flag, int wake_flags)
	if (p->nr_cpus_allowed == 1)
		return prev_cpu;

	if (sysctl_sched_enable_hmp_task_placement)
	if (sched_enable_hmp)
		return select_best_cpu(p, prev_cpu);

	if (sd_flag & SD_BALANCE_WAKE) {
@@ -6105,7 +6105,7 @@ static struct rq *find_busiest_queue(struct lb_env *env,
	unsigned long max_load = 0;
	int i;

	if (sysctl_sched_enable_hmp_task_placement)
	if (sched_enable_hmp)
		return find_busiest_queue_hmp(env, group);

	for_each_cpu(i, sched_group_cpus(group)) {
@@ -6453,7 +6453,7 @@ void idle_balance(int this_cpu, struct rq *this_rq)
	 * most power-efficient idle CPU. */
	rcu_read_lock();
	sd = rcu_dereference_check_sched_domain(this_rq->sd);
	if (sd && sysctl_sched_enable_power_aware) {
	if (sd && sched_enable_power_aware) {
		for_each_cpu(i, sched_domain_span(sd)) {
			if (i == this_cpu || idle_cpu(i)) {
				cost = power_cost_at_freq(i, 0);
@@ -6631,7 +6631,7 @@ static inline int find_new_ilb(int call_cpu, int type)
{
	int ilb;

	if (sysctl_sched_enable_hmp_task_placement)
	if (sched_enable_hmp)
		return find_new_hmp_ilb(call_cpu, type);

	ilb = cpumask_first(nohz.idle_cpus_mask);
@@ -6844,7 +6844,7 @@ static int select_lowest_power_cpu(struct cpumask *cpus)
	int lowest_power_cpu = -1;
	int lowest_power = INT_MAX;

	if (sysctl_sched_enable_power_aware) {
	if (sched_enable_power_aware) {
		for_each_cpu(i, cpus) {
			cost = power_cost_at_freq(i, 0);
			if (cost < lowest_power) {
@@ -6947,7 +6947,7 @@ static inline int _nohz_kick_needed(struct rq *rq, int cpu, int *type)
{
	unsigned long now = jiffies;

	if (sysctl_sched_enable_hmp_task_placement)
	if (sched_enable_hmp)
		return _nohz_kick_needed_hmp(rq, cpu, type);

	/*
+2 −2
Original line number Diff line number Diff line
@@ -1286,7 +1286,7 @@ select_task_rq_rt(struct task_struct *p, int sd_flag, int flags)
	if (p->nr_cpus_allowed == 1)
		goto out;

	if (sysctl_sched_enable_hmp_task_placement)
	if (sched_enable_hmp)
		return select_task_rq_rt_hmp(p, sd_flag, flags);

	/* For anything but wake ups, just return the task_cpu */
@@ -1561,7 +1561,7 @@ static int find_lowest_rq(struct task_struct *task)
	int this_cpu = smp_processor_id();
	int cpu      = task_cpu(task);

	if (sysctl_sched_enable_hmp_task_placement)
	if (sched_enable_hmp)
		return find_lowest_rq_hmp(task);

	/* Make sure the mask is initialized first */
+3 −2
Original line number Diff line number Diff line
@@ -753,7 +753,8 @@ static inline unsigned long capacity_scale_cpu_freq(int cpu)

#ifdef CONFIG_SCHED_HMP

extern unsigned int sysctl_sched_enable_hmp_task_placement;
extern unsigned int sched_enable_hmp;
extern unsigned int sched_enable_power_aware;

int mostly_idle_cpu(int cpu);
extern void check_for_migration(struct rq *rq, struct task_struct *p);
@@ -766,7 +767,7 @@ extern unsigned int power_cost_at_freq(int cpu, unsigned int freq);

#else /* CONFIG_SCHED_HMP */

#define sysctl_sched_enable_hmp_task_placement 0
#define sched_enable_hmp 0

static inline void check_for_migration(struct rq *rq, struct task_struct *p) { }
static inline void pre_big_small_task_count_change(void) { }
Loading