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

Commit 599bfc75 authored by Srivatsa Vaddagiri's avatar Srivatsa Vaddagiri
Browse files

sched: Per-cpu prefer_idle flag



Remove the global sysctl_sched_prefer_idle flag and replace it with a
per-cpu prefer_idle flag. The per-cpu flag is expected to same for all
cpus in a cluster. It thus provides convenient means to disable
packing in one cluster while allowing packing in another cluster.

Change-Id: Ie4cc73bb1a55b4eac5697be38e558546161faca1
Signed-off-by: default avatarSrivatsa Vaddagiri <vatsa@codeaurora.org>
parent 92ba1d55
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1247,7 +1247,7 @@ the CPU.

** 7.23 sched_prefer_idle

Appears at: /proc/sys/kernel/sched_prefer_idle
Appears at: /sys/devices/system/cpu/cpuX/sched_prefer_idle

Default value: 1

+43 −1
Original line number Diff line number Diff line
@@ -277,13 +277,52 @@ static ssize_t __ref store_sched_mostly_idle_nr_run(struct device *dev,
	return err;
}

static ssize_t show_sched_prefer_idle(struct device *dev,
		 struct device_attribute *attr, char *buf)
{
	struct cpu *cpu = container_of(dev, struct cpu, dev);
	ssize_t rc;
	int cpunum;
	int prefer_idle;

	cpunum = cpu->dev.id;

	prefer_idle = sched_get_cpu_prefer_idle(cpunum);

	rc = snprintf(buf, PAGE_SIZE-2, "%d\n", prefer_idle);

	return rc;
}

static ssize_t __ref store_sched_prefer_idle(struct device *dev,
				  struct device_attribute *attr,
				  const char *buf, size_t count)
{
	struct cpu *cpu = container_of(dev, struct cpu, dev);
	int cpuid = cpu->dev.id;
	int prefer_idle, err;

	err = kstrtoint(strstrip((char *)buf), 0, &prefer_idle);
	if (err)
		return err;

	err = sched_set_cpu_prefer_idle(cpuid, prefer_idle);
	if (err >= 0)
		err = count;

	return err;
}

static DEVICE_ATTR(sched_mostly_idle_freq, 0664, show_sched_mostly_idle_freq,
						store_sched_mostly_idle_freq);
static DEVICE_ATTR(sched_mostly_idle_load, 0664, show_sched_mostly_idle_load,
						store_sched_mostly_idle_load);
static DEVICE_ATTR(sched_mostly_idle_nr_run, 0664,
		show_sched_mostly_idle_nr_run, store_sched_mostly_idle_nr_run);
#endif
static DEVICE_ATTR(sched_prefer_idle, 0664,
		show_sched_prefer_idle, store_sched_prefer_idle);

#endif	/* CONFIG_SCHED_HMP */

/*
 * Print cpu online, possible, present, and system maps
@@ -465,6 +504,9 @@ int __cpuinit register_cpu(struct cpu *cpu, int num)
	if (!error)
		error = device_create_file(&cpu->dev,
					 &dev_attr_sched_mostly_idle_freq);
	if (!error)
		error = device_create_file(&cpu->dev,
					 &dev_attr_sched_prefer_idle);
#endif

	return error;
+2 −0
Original line number Diff line number Diff line
@@ -1917,6 +1917,8 @@ sched_set_cpu_cstate(int cpu, int cstate, int wakeup_energy, int wakeup_latency)
extern int sched_set_boost(int enable);
extern int sched_set_init_task_load(struct task_struct *p, int init_load_pct);
extern u32 sched_get_init_task_load(struct task_struct *p);
extern int sched_set_cpu_prefer_idle(int cpu, int prefer_idle);
extern int sched_get_cpu_prefer_idle(int cpu);
extern int sched_set_cpu_mostly_idle_load(int cpu, int mostly_idle_pct);
extern int sched_get_cpu_mostly_idle_load(int cpu);
extern int sched_set_cpu_mostly_idle_nr_run(int cpu, int nr_run);
+0 −1
Original line number Diff line number Diff line
@@ -61,7 +61,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_prefer_idle;
extern unsigned int sysctl_sched_powerband_limit_pct;
extern unsigned int sysctl_sched_boost;

+1 −0
Original line number Diff line number Diff line
@@ -9021,6 +9021,7 @@ void __init sched_init(void)
		rq->cur_irqload = 0;
		rq->avg_irqload = 0;
		rq->irqload_ts = 0;
		rq->prefer_idle = 1;
#ifdef CONFIG_SCHED_FREQ_INPUT
		rq->old_busy_time = 0;
		rq->curr_runnable_sum = rq->prev_runnable_sum = 0;
Loading